生成AI資格対策(生成AIパスポート+G検定)
CNN
画像を1列に伸ばした瞬間に、二重に困る
画像は縦横に並んだ画素の集まりです。これを1列に引き伸ばして全結合層に入れる方法も、原理の上では成り立ちます。しかし2つの困りごとが出ます。
1つ目はパラメータが爆発することです。1辺が数百画素の画像を1列に伸ばすと、入力は数万から数十万の数値になります。次の層のユニット1つごとにその全部と結ぶ重みが必要なので、重みの数は掛け算で膨れ上がります。学習に必要なデータ量も計算量も現実的でなくなります。
2つ目は位置のずれに弱いことです。1列に伸ばした瞬間、どの画素が隣同士だったかという情報は消えます。猫が画面の左にいる場合と右にいる場合では入る場所がまったく変わるため、片方を学んでももう片方には効きません。人から見れば同じ猫でも、モデルには別物に見えるわけです。この2つをまとめて解いたのが畳み込みニューラルネットワーク(CNN)です。
小さな窓を滑らせ、同じ重みを使い回す
畳み込み層は、画像全体に対してフィルタ(カーネル)と呼ばれる小さな窓を滑らせ、窓の中の画素とフィルタの値を掛けて足し合わせます。窓は数画素四方といった小ささなので、1回の計算が見るのは画像の一部だけです。これにより、縦の線、横の線、色の変わり目といった局所的な特徴を捉えます。
ここで効いてくるのが重み共有です。同じフィルタを画像のどの位置でも使い回すため、覚えるべき重みはフィルタ1枚ぶんで済みます。これがパラメータ爆発を防ぎます。さらに、同じフィルタが画像のどこでも同じ反応を返すので、対象が左にあっても右にあっても同じ特徴として拾えます。
畳み込みの出力は再び平面の形をしていて、これを特徴マップと呼びます。フィルタを複数枚使えば、その枚数だけ特徴マップが積み重なります。層を重ねるほど、線のような単純な特徴から部品へ、そして物体全体へと、捉える特徴が抽象的になっていきます。
窓の滑らせ方には2つの設定があります。ストライドは窓を何画素ずつずらすかで、大きくすると出力は小さくなります。パディングは画像の周囲をあらかじめ埋めておく処理で、これをしないと畳み込むたびに出力が縮み、端の画素が中央より使われる回数が少なくなります。
位置が少しずれても、同じ答えを返したい
プーリング層は特徴マップを小さくまとめる層です。窓の中の最大値だけを残す最大値プーリングは、最も強い反応を残すので特徴の有無を捉えやすく、窓の中の平均を取る平均値プーリングは全体をならすので変化がなだらかになります。
プーリングには学習する重みがありません。役割は、特徴マップを縮めて計算量を減らすことと、位置のずれへの頑健性を与えることです。窓の中で1画素ぶんずれても、最大値や平均は変わらないか、変わっても小さいためです。畳み込みが「どこにあっても同じ特徴として拾う」役目を、プーリングが「多少ずれても同じ出力になる」役目を担っていると整理できます。
この構成を重ねて層を深くしていくと、別の壁にぶつかります。学習は、出力側で測った誤差を入力側へ配り直すことで進みますが、層が深いほど途中で配分がやせ細り、入力に近い層まで届かなくなります。これが勾配消失です。ResNet が導入したスキップ結合(ショートカット結合)は、いくつかの層を飛び越して入力をそのまま先の層へ足し込みます。この迂回路があるおかげで誤差が前の層まで届きやすくなり、層を大幅に深くできるようになりました。
試験ではこう問われる
- 「位置のずれに強くする働きを持つのはどれか」はプーリングが答えです。畳み込みも位置に関して有利ですが、ずれへの頑健性という言い方で名指しされるのはプーリングです
- 「パラメータ数を抑える仕組み」とあれば重み共有です。プーリングと迷わせてきますが、プーリングは重みを持たないので削減の対象がそもそもありません
- 「非常に深いネットワークを学習可能にした構造」は ResNet のスキップ結合で、理由は勾配消失の緩和です
- 出力サイズを制御する語としてストライドとパディングが問われます。パディングは端の情報を保つためでもある点が引っかけになります
復習ミニクイズ
ResNet が従来より大幅に層を深くできた理由として最も適切なものはどれですか。