残差学習とは?ResNetの仕組みを新人エンジニア向けにやさしく解説

こんにちは。ゆうせいです。

画像認識やディープラーニングを学んでいると、「残差学習」という言葉を目にする機会があります。

名前だけを見ると、少し難しそうですよね。

残差学習とは、ニューラルネットワークに「求めたい答えそのもの」を学習させるのではなく、「入力と答えの差分」を学習させる考え方です。

深いニューラルネットワークを効率よく学習させるために使われており、代表的なモデルとしてResNetがあります。

新人エンジニアでも理解できるように、身近なたとえを交えながら見ていきましょう!

残差とは、「予想した値と実際の値との差」を意味します。

たとえば、今日の気温を20度と予想したものの、実際には23度だったとしましょう。

予想と実際の差は3度です。この3度が残差にあたります。

機械学習の世界でも、基準となる値からどれくらい違っているかを残差として扱います。

残差学習では、入力された情報を最初から大きく変換するのではなく、入力に対して「どの部分を修正すればよいか」を学習します。

通常のニューラルネットワークでは、入力から目的の出力を直接求めようとします。

一方、残差学習では、入力と目的の出力との差分を学習します。

考え方を数式で表すと、次のようになります。

y = F(x) + x

日本語に置き換えると、次の関係です。

出力 = 学習した差分 + 入力

xは入力、F(x)はニューラルネットワークが学習する差分、yは最終的な出力を表します。

たとえば、すでに80点の答案を90点に改善したい場面を想像してください。

最初から90点の答案を作り直すよりも、足りない10点分だけを見つけて修正するほうが簡単ですよね。

残差学習も同じ発想です。

ニューラルネットワークは、すべてを一から作り直すのではなく、入力に何を加えれば目的の出力になるかを学習します。

残差学習では、「スキップ接続」と呼ばれる構造が使われます。

スキップ接続とは、入力データを途中の処理層に通すだけでなく、数層先まで直接届ける仕組みです。

道路にたとえるなら、一般道だけで目的地に向かうのではなく、途中にバイパス道路を用意するイメージです。

ニューラルネットワークの通常ルートでは、入力データが複数の層を順番に通過します。

スキップ接続では、入力データが複数の層を飛び越え、後ろの層へ直接渡されます。

飛び越えてきた入力と、通常ルートで計算された差分を足し合わせることで、最終的な出力を作ります。

ニューラルネットワークは、層を増やすほど複雑な特徴を学習できます。

画像認識を例に考えてみましょう。

浅い層では、線や色の境界といった単純な特徴を捉えます。

少し深い層では、目や鼻、タイヤなどの部品を認識します。

さらに深い層では、人の顔や自動車といった大きなまとまりを判断できるようになります。

「それなら、層を増やし続ければ性能も上がるのでは?」と思いませんか?

実際には、単純に層を増やすだけでは学習がうまく進まない場合があります。

代表的な原因が、勾配消失問題です。

勾配とは、ニューラルネットワークのパラメーターをどの方向へ、どれくらい修正すればよいかを示す情報です。

料理でたとえるなら、「塩をもう少し減らす」「加熱時間を少し長くする」といった改善の指示にあたります。

ニューラルネットワークの学習では、出力側で計算した誤差を入力側へ逆向きに伝えます。この処理を誤差逆伝播と呼びます。

しかし、層が非常に深くなると、誤差の情報が前の層へ届くまでに小さくなりすぎる場合があります。

改善の指示が伝言ゲームの途中で薄れてしまうような状態です。

入力に近い層まで十分な情報が届かないため、パラメーターを適切に更新できません。

残差学習でスキップ接続を使うと、勾配が流れる近道を作れます。

深いネットワークでも学習に必要な情報が前の層まで伝わりやすくなるのです。

ResNetは、「Residual Network」の略で、残差学習を利用したニューラルネットワークです。

中心となる部品は、残差ブロックと呼ばれます。

残差ブロックでは、入力をいくつかの層に通して差分を計算し、元の入力を加えます。

処理の流れは次のとおりです。

入力を受け取る

複数の層で差分を計算する

元の入力をスキップ接続で運ぶ

計算した差分と元の入力を足す

足し合わせた結果を次のブロックへ渡す

残差ブロックを繰り返し積み重ねることで、非常に深いニューラルネットワークを構築できます。

残差学習の主なメリットは、深いニューラルネットワークを学習しやすくできる点です。

スキップ接続によって勾配が伝わりやすくなり、勾配消失問題を軽減できます。

入力に大きな変更が必要ない場合、ニューラルネットワークは差分をほぼゼロにすればよいため、不要な変換を避けやすくなります。

すでに完成度の高い文章を修正するとき、全文を書き直すよりも、誤字や不自然な表現だけを直すほうが簡単です。残差学習にも同じ利点があります。

また、ResNetは画像分類だけでなく、物体検出、画像生成、医療画像解析など、さまざまな分野で活用されています。

残差学習にも注意点があります。

まず、モデルを深くすると計算量やメモリ使用量が増えます。

スキップ接続によって学習しやすくなったとしても、層を増やせば必ず性能が向上するわけではありません。

学習データが少ない場合には、訓練データへ過剰に適応する過学習が起こる可能性もあります。

過学習とは、練習問題の答えだけを丸暗記し、初めて見る問題に対応できなくなる状態です。

さらに、スキップ接続で足し算を行うためには、入力と差分のデータ形状を合わせる必要があります。

画像の縦幅、横幅、チャンネル数などが異なる場合は、追加の変換処理が必要です。

残差学習を使えば設計上の問題がすべて解決するわけではありません。データ量、モデルの大きさ、計算環境を考えながら使いましょう!

残差学習とは、目的の出力を直接学習するのではなく、入力からの差分を学習する方法です。

スキップ接続を使い、元の入力を後ろの層へ直接届けます。

差分と元の入力を足し合わせることで、最終的な出力を作ります。

勾配が伝わる経路を確保できるため、深いニューラルネットワークでも学習しやすくなります。

代表的なモデルがResNetです。

「全部を作り直すのではなく、必要な修正だけを学ぶ」と覚えておくと理解しやすいでしょう。

残差学習の基本を理解した後は、まずニューラルネットワークの順伝播と誤差逆伝播を学んでください。

次に、勾配消失問題と活性化関数の関係を確認しましょう。

その後、残差ブロックの処理を自分で実装し、通常のニューラルネットワークと学習結果を比較してみると理解が深まります。

最後に、ResNet18やResNet50などの既存モデルを動かし、層の数や残差ブロックの構成を観察してみてください。

数式を眺めるだけで終わらせず、小さなモデルを実際に動かしてみましょう。残差学習が深いネットワークを支える仕組みを、より具体的に理解できるはずです!

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。