3秒でわかる
ニューラルネットワークを何層も重ね、データから特徴そのものを学ばせる機械学習の手法。画像認識や生成 AI の中身はほぼこれで動いています。
30秒図解
もう少し詳しく
どういうものか
入力を受け取って重み付きの計算を繰り返す「層」を何段も積み重ね、大量のデータから正解に近づくように重みを自動調整していく機械学習の手法です。層が深く積まれることから深層学習と呼ばれます。
従来の機械学習では、人間が「この画像のどこを見れば犬と猫を区別できるか」を設計して数値化していました。深層学習では、その着眼点そのものをデータから見つけさせます。浅い層が輪郭や色の変化のような単純な特徴をとらえ、深い層に進むほど目や耳といったまとまった形をとらえる、という段階的な表現が学習の過程で自然にできあがります。
なぜ必要か
画像、音声、文章のように、人間が特徴を言葉で書き出しにくいデータを扱えるようになったことが最大の理由です。「猫らしさ」をルールで書き下すのは事実上不可能ですが、ラベル付きの画像を大量に与えれば区別できるようになります。
一方で、万能ではありません。数千件程度の表形式データで売上を予測する用途では、勾配ブースティング木のような手法のほうが精度も学習時間も勝ることが普通にあります。データ量が十分にあり、特徴を人間が定義しづらい領域でこそ効いてくる手法です。
具体例
手書き数字の分類を PyTorch で組むと、層を並べるだけの短い記述になります。
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 128), # 28x28 の画素を平らにして入力
nn.ReLU(), # 非線形性を入れる
nn.Dropout(0.2), # <a href="/glossary/overfitting" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">過学習</a>を抑える
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 10), # 0-9 の 10 <a href="/glossary/class" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">クラス</a>
)
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)活性化関数の ReLU を全部外すと、何層積んでも数学的には 1 層の線形変換と同じ表現力しか持てません。層を深くする意味は、この非線形の関数が間に挟まっていることで生まれます。
つまずきやすいところ
学習データでの正解率だけを見て喜んでしまう失敗が定番です。訓練データを丸暗記した状態でも訓練時の精度は上がるため、必ず学習に使っていない検証データで測ります。訓練の精度だけが上がり続け、検証の精度が下がり始めた地点が過学習の入り口になります。
学習が全く進まないときは、学習率が大きすぎて値が発散しているか、入力の正規化を忘れているかのどちらかであることが多く、モデルの構造をいじる前にそこを確認します。
似た用語との違い
機械学習は「データから規則を学ぶ手法」全体を指す広い言葉で、深層学習はその中の一分野です。さらに、深層学習の中でも文章生成に特化したものが大規模言語モデルにあたります。範囲は AI、機械学習、深層学習、大規模言語モデルの順に狭くなっていく入れ子の関係になっています。