[Medical AI with Python:P22.1] Transformerモデルの学習方法 — 事前学習とファインチューニングを理解する

  • URLをコピーしました!
目次

はじめに

生成系AI、とくにTransformerモデルは、医療の現場や研究の現場において、ますます重要性を増しています。 たとえば、以下のような応用が既に始まっています:

  • 電子カルテの文書から要点を自動要約して、診療録作成を効率化する
  • 過去の診療履歴や検査記録から、疾患リスクを予測する
  • 文献検索や論文要旨の自動分類・翻訳・要約など、研究支援に活用する

これらのアプリケーションの中心にあるのが「Transformer」というニューラルネットワーク構造です。 特に最近注目されているのは、「意味を理解し、文脈に沿った新しいテキストを生み出す」という、生成的(Generative)な能力です。

しかし、こうしたAIモデルを臨床や研究に正しく・安全に応用するためには、以下の問いに明確な答えを持っておく必要があります:

「Transformerはどうやって学んでいるのか?」

この問いに答えるためには、単にモデルの使い方を知るだけでなく、その学習メカニズムの中身を理解することが欠かせません。 なぜなら、学習の過程を知ることで、次のようなことが可能になるからです:

  • 自分のデータに合ったモデルの設計や改良ができる
  • 結果の解釈性や信頼性をより正確に評価できる
  • モデルが「なぜそう出力したのか」の理由を説明できる

図:Transformerの学習プロセスの全体像

このように、Transformerモデルの学習は「汎用知識の獲得 → 専門タスクへの適応 → 実際の応用」という三段階に分けて理解できます。

本章では、この学習の仕組みを以下の3つの柱に沿って解説します。 読者が生成AIを自らの研究や臨床に応用できるよう、数式・コード・事例も交えながら、直感的に理解できる構成にしています。

  1. 事前学習(Pretraining)とは何か
    — 一般的な言語パターンを、教師なしで大量に学ぶ仕組み
  2. Next Token PredictionとCross-Entropy損失関数
    — モデルが「次の単語」を予測できるようになる学習の数学的な原理
  3. ファインチューニング(Fine-tuning)による応用力の獲得
    — 医療や研究に特化したモデルを構築する方法

これらを順に追っていくことで、「Transformerはどのようにして文脈を理解し、意味のある出力を行っているのか」という本質に一歩ずつ近づいていきます。

❶ 事前学習(Pretraining)とは何か?

Transformerモデル、たとえばGPT(Generative Pre-trained Transformer)やBERTなどは、最初から医療文書を「理解」できるわけではありません。まず必要なのは、「言語の使い方」そのものを膨大なデータから学ぶ訓練です。これが事前学習(Pretraining)です。

この学習でモデルは、人間のように「読んで理解する」のではなく、文の流れから次にくる単語を予測するというタスクを繰り返し実行します。これをNext Token Prediction(次トークン予測)と呼びます。

直感的なたとえ:続きがわかるクイズ

たとえば、あなたが以下のような文を見たとします:

私は医者で___。

この「___」に入る言葉を直感的に「す」と答えられるのは、日本語の構造や意味の使い方を知っているからです。Transformerも、数億〜数十億文の予測クイズを通して、「文法的に正しく、意味的にも自然な続きとは何か?」を統計的に学びます。

図:Next Token Predictionの学習イメージ


【入力】私は 医者 で   → 【予測対象】す

【入力】高血圧 の 治療 に   → 【予測対象】ついて

【入力】この 新薬 は よく   → 【予測対象】効く

このように、文章の一部を与え、次に来る単語を予測させる形で、モデルは「言葉のつながり方」や「意味の傾向」を統計的に学んでいきます。

この学習は「自己教師あり学習」と呼ばれる

このように、データ(テキスト)そのものの一部を「正解ラベル」として利用する手法を、自己教師あり学習(Self-Supervised Learning)と呼びます。

通常の機械学習では、正解ラベル(たとえば「この画像は犬です」)を人が用意する必要がありますが、自己教師あり学習では、教師データをテキスト自身から自動的に生成できるため、膨大なデータでの事前学習が可能になります。

数式で見るNext Token Prediction

Transformerの学習において、文脈(前の単語列)を与えられたとき、次の単語 \( w_t \) を予測する確率は以下のように表されます:

\[ P(w_t \mid w_1, w_2, …, w_{t-1}) \]

つまり、「今までに見た単語列」\( w_1, w_2, …, w_{t-1} \) をもとに、「次の単語」\( w_t \) が現れる確率を計算するというタスクです。

このような確率分布を出力するモデルを作り、実際の正解とどれくらいズレているかを損失関数で評価し、少しずつ重みを調整する、という学習を繰り返していきます。

❷ Cross-Entropy損失関数とは?

Transformerモデルが「次の単語を何にすべきか?」を学ぶためには、「どれだけ予測が正確だったか」を数値化する方法が必要です。 そのときに使われるのが、機械学習で広く用いられている交差エントロピー損失関数(Cross-Entropy Loss)です。

この関数は、モデルが出した予測(確率)と、本当の正解(ラベル)とのズレを測るもので、ズレが大きければ大きいほど損失値も大きくなり、「学習がうまくいっていない」ことを意味します。

直感的なたとえ:自信をもって正解するほど評価される

Cross-Entropyは、「クイズに正解するだけでなく、自信を持って答えられるかどうかも重要」という考えに似ています。


ケースA:がんの確率90% → 実際にがん → 自信を持って正解 → 損失は小さい
ケースB:がんの確率55% → 実際にがん → ためらいながら正解 → 損失はやや大きい
ケースC:非がんの確率90% → 実際はがん → 自信満々で間違えた → 損失は非常に大きい

このように、Cross-Entropy損失は「正しい答えに高い確率をつけたかどうか」で、モデルの評価をしていきます。

Cross-Entropyの定義(数式と解説)

損失関数は次のように定義されます:

\[ L = – \sum_{i} y_i \log(p_i) \]

この数式の意味は、以下の通りです:

  • \( i \):語彙の中のすべての単語を表すインデックス(例:0〜49999など)
  • \( y_i \):正解の単語だけ 1、それ以外はすべて 0(one-hotベクトル)
  • \( p_i \):モデルが各単語に対して出力した確率(Softmaxで得られる)

この式は、「正解の単語に対して、モデルがどれだけ高い確率を出せたか」を見るためのもので、 実際には、正解の単語のインデックス \( i = \text{correct} \) に対してのみ有効になります:

\[ L = – \log(p_{\text{correct}}) \]

つまり、正解に近い確率を出せば損失は小さくなり、遠ければ損失が大きくなります。

図:Cross-Entropy損失と確率の関係


正解単語 =「医者」

モデル出力:
「医者」  → 90%(損失:小)
「学生」  → 8%(損失:関係なし)
「教師」  → 2%(損失:関係なし)

損失 L = - log(0.90) ≒ 0.105

このように、正解以外の単語には損失の計算は影響せず、正解単語の予測確率だけが評価される仕組みになっています。

Cross-Entropyはなぜ重要なのか?

この損失関数は、Transformerだけでなく、BERTやCNN、RNNなど、あらゆる分類・予測タスクで使われています。特に次の理由から非常に重要です:

  • ✅ 確率的な予測の「自信度」まで評価できる
  • ✅ 正解に対してだけ学習が集中するので効率が良い
  • ✅ 微分可能で、勾配降下法と相性が良い

Pythonコードで体験:Next Token PredictionとCross-Entropy損失

ここでは、Transformerの学習で使われる「次の単語を予測する」処理を、PyTorchを使って再現してみましょう。 扱う語彙はたった5語ですが、実際のモデルと同じ構造で動作します。

学習処理(forward計算)の基本要素である:

  • one-hotベクトルによる単語の表現
  • 線形層(Linear Layer)での重み変換
  • Softmaxで確率分布の出力
  • CrossEntropy損失による予測精度の評価

を順に体験していきます。

# 必要なモジュールをインポート
import torch                         # PyTorch本体。テンソル操作や自動微分ができる
import torch.nn as nn               # ニューラルネットの基本構造(レイヤーなど)を定義するモジュール

# 語彙を定義(日本語の単語を含む)
vocab = ["私は", "医者", "です", "学生", "。"]  # 単語リスト(5語のみ)
word_to_idx = {word: idx for idx, word in enumerate(vocab)}  
# 各単語をインデックス番号に変換(例:「私は」→0、「医者」→1)

# 入力とターゲット(正解単語)を定義
input_words = ["私は", "医者"]       # 入力文:「私は 医者」
target_word = "です"                # 次に来るべき正解単語(予測対象)

# one-hotベクトルで入力を表現(例:語彙数 = 5 → ベクトル長 = 5)
x = torch.tensor([[1, 0, 0, 0, 0],   # 「私は」のone-hot表現(インデックス0)
                  [0, 1, 0, 0, 0]],  # 「医者」のone-hot表現(インデックス1)
                 dtype=torch.float32)  # データ型はfloat32(計算に必要)

# 単純な線形層(語彙数→語彙数)を定義
linear = nn.Linear(5, 5)            # 入力次元=語彙数、出力次元=語彙数の線形変換
# → これは「Embedding」や「予測ベクトル生成」の代わりとなる役割

# 入力ベクトルを平均し、線形変換
logits = linear(x.mean(dim=0))     # 2単語のベクトルの平均を計算 → 文全体の表現と見なす
# → logitsは「各単語に対応するスコア(未正規化確率)」

# Softmaxでスコアを確率に変換
softmax = nn.Softmax(dim=0)        # dim=0 → ベクトル全体でSoftmaxを計算
probs = softmax(logits)            # 各単語に対する予測確率を出力

# 正解ラベルを数値インデックス形式で取得
target_idx = torch.tensor(word_to_idx[target_word])  # 「です」→インデックス2など

# 損失関数(CrossEntropyLoss)を定義し、損失を計算
loss_fn = nn.CrossEntropyLoss()    # 内部でSoftmax + Cross-Entropyが行われる
loss = loss_fn(logits.unsqueeze(0), target_idx.unsqueeze(0))  
# logits.unsqueeze(0):バッチ次元を追加(形状を [1, 5] に)
# target_idx.unsqueeze(0):同様に [1] に変形

# 出力結果を表示
print("出力確率:", probs)          # 各単語に対する確率を表示
print("損失(Cross-Entropy):", loss.item())  # Cross-Entropy損失(予測精度の悪さ)

↓以下は出力

出力確率: tensor([0.1905, 0.2080, 0.1782, 0.2092, 0.2140], grad_fn=<SoftmaxBackward0>)
損失(Cross-Entropy): 1.7248523235321045

コードの解説と補足

このコードは、Transformerモデルの一部にあたる「単語ベクトルから次トークン予測スコアを出力し、それを評価する」過程を模倣しています。 語彙サイズを5語に限定しているため、最小限の例で仕組みを可視化できます。

なお、本来のTransformerではこの処理は「埋め込み+Multi-Head Attention+Feed Forward」の後に行われますが、ここではその後半部分(ロジット計算と損失)だけを抽出しています。

❸ ファインチューニング(Fine-tuning)とは?

これまでに解説した「事前学習(Pretraining)」では、モデルはWikipediaや書籍、Webなどの大規模テキストから、言語一般のパターンや知識を広く学びます。 しかし、実際の応用──とくに医療分野では、より深い専門知識や、微妙な表現の違いを理解する力が求められます。

事前学習だけでは対応できない医療特有の例


例1:「非小細胞肺がん」と「NSCLC」は同じ疾患を指すが、表現が異なる
例2:「既往歴に糖尿病あり」と「糖尿病は既知」は意味が似ている
例3:「β遮断薬」が「高血圧治療薬」として言及されるが、薬品名ではない

このような表現は、一般的なWeb文書ではあまり出現せず、医療データ特有の表現です。 そのため、こうした専門的知識・語彙・文脈への対応力をモデルに獲得させるには、事前学習済みモデルに医療文書で再学習を施す必要があります。

これが「ファインチューニング(微調整)」

ファインチューニング(Fine-tuning)とは、以下のような流れで行われます:


【1】一般文書で事前学習された大規模モデル(例:GPT、BERT)を用意する
   ↓
【2】医療ドメインの文書(電子カルテ、医学論文、診療ガイドラインなど)を準備
   ↓
【3】その医療データを使って、モデルを追加学習させる(=微調整)
   ↓
【4】医療応答・要約・分類などに強いモデルが完成する

このとき、すべてのモデルパラメータを更新する「全体ファインチューニング」と、一部のみを更新する「パラメータ効率型ファインチューニング(例:LoRA)」などの手法があります。

図:事前学習とファインチューニングの関係

このように、ファインチューニングは「モデルに専門性を身につけさせる」ための工程です。

具体例:医療応用におけるファインチューニング

タスクファインチューニング対象活用例
病名抽出(NER)電子カルテの文書「頭痛」「糖尿病」などの症状や病名を抽出
医療QA医学論文+FAQデータ「高血圧の第一選択薬は?」といった質問に自動応答
診療録要約SOAP形式カルテ医師が書いた診療録から「要点」だけを抽出

なぜファインチューニングが必要なのか?(まとめ)

  • ✅ 一般知識では扱えない「専門用語・言い換え表現」への対応
  • ✅ 医療特有の文脈(症状・薬剤の関係など)を深く理解させる
  • ✅ 自分の施設・研究領域に最適化されたモデル構築が可能

このように、ファインチューニングは、生成系AIを汎用モデルから医療専門家へと育てるためのステップなのです。

🔬 医療応用の具体例

ここまで見てきたTransformerの学習方法(事前学習・ファインチューニング)は、実際の医療分野ではどのように使われているのでしょうか?
以下は、実際に生成系AI(主にTransformerベースのモデル)が活用されている代表的な応用例です。

応用分野使用方法使用モデル技術的特徴
診療録の自動要約SOAP形式などのカルテ情報から要点を抽出・要約するGPT系(例:GPT-2/3 ファインチューニング)自己回帰生成(auto-regressive)により自然な文を生成
医学論文の自動分類PubMedのタイトル・抄録から研究領域(例:腫瘍学、免疫学)を分類BERT系(例:PubMedBERT、ClinicalBERT)双方向エンコーディングで意味の深い特徴を抽出
病名・症状の抽出(NER)電子カルテから疾患名や症状名を自動で抽出するBioBERT, Med7 などトークン単位の分類(Named Entity Recognition)
医療QA(質問応答)「高血圧の第一選択薬は?」などの質問に自動応答BERT + RAG、MedPalmなどRetriever+Generatorによる回答生成(検索拡張生成)
構造化情報の抽出非構造データ(自由記述)から診断・投薬情報を構造化Encoder-Decoder型(T5、BARTなど)自由記述を構造化されたスロット形式へ変換

図:医療タスクごとのモデル選択イメージ

【入力文】
「本日、糖尿病で内服中のメトホルミンに加え、インスリン注射を開始した。」
タスク出力例主なモデル
要約「糖尿病治療としてインスリン開始」GPT, BART
病名抽出「糖尿病」BioBERT, Med7
投薬情報抽出「メトホルミン」「インスリン」ClinicalBERT 等
QA 応答Q:「糖尿病の治療薬は?」 → A:「インスリン等」MedPalm, RAG

このように、ひとつの医療文書からでも、目的に応じてさまざまなTransformerモデルを活用することができます。

🧠 まとめ

🧠 まとめ:Transformerモデルの学習と医療応用

ここまでの内容をまとめると、Transformerモデルが医療分野で活用されるためには、3つの段階的な理解が必要です。それぞれのステップがどのような意味を持ち、どう学習と応用につながるのかを整理しましょう。

① 「次の単語を予測する」ことで言語を学ぶ

Transformerモデルは、Next Token Prediction(次トークン予測)というタスクを繰り返すことで、「文脈の中で、もっとも自然な次の単語は何か?」を学習します。これはあくまで文を「続ける力」を育てる学習です。


入力:私は 医者 で
出力:す。

このような学習は、大量の文書に対して自動で行うことができるため、自己教師あり学習として効率的に知識を蓄えることができます。

② 損失関数としてCross-Entropyが使われる

モデルが「次の単語」をどれだけ正しく予測できたかを数値的に評価するために、交差エントロピー(Cross-Entropy)損失関数が使われます。

数式で表すと以下のようになります:

\[ L = – \sum_{i} y_i \log(p_i) \]

  • \( y_i \):正解単語(one-hot表現で1、それ以外は0)
  • \( p_i \):モデルが出力した各単語の確率

この式は、「正解の単語に高い確率を出せるほど損失が小さくなる」という直感的な設計になっています。損失が小さいほど、モデルの予測がより正確であることを示します。

③ ファインチューニングで医療応用に特化する

汎用的に学んだモデルに、医療文書(カルテ、論文、FAQなど)を使って追加学習させることで、医療専門知識に特化したAIモデルを構築できます。これがファインチューニングです。


Step 1:大規模一般文書で事前学習(汎用モデル)
Step 2:医療データで再学習(ファインチューニング)
Step 3:医療応用タスクに対応(要約・抽出・分類・QAなど)

この工程により、医療AIはより正確で、より臨床的に使えるツールとして機能します。

✅ 本章の学びを次にどう活かすか?

  • 自分の研究分野や医療データに合ったモデルの選択・調整ができるようになる
  • AIモデルの出力を鵜呑みにせず、「どう学習されてきたか」をもとに判断できる
  • 次章以降の構造理解(Attention, Multi-Head, FFNなど)に進む準備ができる

次章では、Transformerモデルの内部構造を1層ずつ分解し、Self-AttentionやMulti-Head Attentionの仕組みを丁寧に紐解いていきます。

📚 参考文献

  1. Vaswani A, et al. Attention Is All You Need. NeurIPS. 2017.
  2. Devlin J, et al. BERT: Pre-training of Deep Bidirectional Transformers. arXiv preprint. 2018.
  3. Lee J, et al. BioBERT: a pre-trained biomedical language representation model. Bioinformatics. 2020.
  4. Liu Y, et al. RoBERTa: A Robustly Optimized BERT Pretraining Approach. arXiv preprint. 2019.
  5. Radford A, et al. Language Models are Few-Shot Learners. OpenAI. 2020.
  6. Lehman E, et al. A Survey of Clinical Natural Language Processing in the United States. JAMIA. 2021.
免責事項・注意事項等
  • 法令遵守について
    本教材はあくまで一般的な学習参考用の内容であり、医師法、薬機法、個人情報保護法、医療広告ガイドライン等の適用判断については、必ず厚生労働省・PMDA・経済産業省・各学会などの最新の法令・ガイドラインをご自身でご確認のうえご利用ください。
  • 医療行為の責任について
    本資料で紹介する AI 技術・手法は臨床診断・治療の補助を目的としていますが、最終的な診断・治療方針の決定および報告書の承認は必ず医師などの専門資格保持者が行ってください。AI の結果のみを鵜呑みにせず、Human-in-the-Loop の原則に則り、人間専門家による検証プロセスを実施してください。
    本コンテンツは、医療AIに関する技術的な学習と理解を深めることを目的としており、特定の医療行為を推奨、あるいは医学的助言を提供するものではありません。実際の臨床判断は、必ず担当の医療専門家にご相談ください。
  • プライバシー保護について
    本コース内で紹介するデータセットを利用する際は、各データセットのライセンス条件および研究倫理指針を厳守し、患者情報の匿名化・同意取得など必要な個人情報保護措置を確実に講じてください。
  • 知的財産権について
    本記事中の図表・コード・文章などを二次利用または転載する場合は、必ず引用元を明示し、権利者の許諾および適切なライセンス表記を行ってください。
  • 情報の正確性について
    本資料に記載する数値、事例、ライブラリのバージョン情報などは執筆時点の情報に基づいています。機能やライブラリはアップデートにより変更される可能性がありますので、必ず最新の公式ドキュメントや文献をご確認のうえ適宜アップデートしてご活用ください。
  • AI 活用の留意点
    本内容には AI の提案をもとに作成した部分が含まれていますが、最終的には専門家の監修・編集のもとで公開しています。特に生成系 AI を用いる場合は、ハルシネーション(誤情報)やバイアスに十分注意し、必ず人間専門家が結果を検証してください。
  • 免責事項
    本資料の利用によって生じたいかなる損害についても、著作者および提供者は一切の責任を負いません。研究・学習目的以外での利用はご遠慮ください。
  • 対象読者・前提知識
    本教材は医療従事者および AI 技術に関心のある技術者を主対象とし、Python の基礎知識や統計学の初歩的理解を前提としています。
  • 環境・互換性
    本資料で扱うコード/ライブラリは執筆時点の特定バージョンを前提としています(例:PyTorch 2.0、Transformers 4.x)。実行環境(OS、ハードウェア、依存パッケージ)によっては動作しない場合がありますのでご注意ください。
  • 免責範囲の明確化
    本教材に記載された内容はいかなる場合も「診療行為」としての効力を持ちません。製品やサービスの導入検討にあたっては、別途法務・品質保証部門との協議および正式な承認プロセスを経てください。
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人/About the Author

AI physician-scientist・連続起業家・元厚生労働省医系技官・医師・医学博士・ハーバード大学理学修士・ケンブリッジ大学MBA・コロンビア大学行政修士。
岡山大学医学部卒業後、内科・地域医療に従事。厚生労働省入省、医療情報技術推進室長、医療国際展開推進室長、救急・周産期医療等対策室長、災害医療対策室長等を歴任。文部科学省出向中はライフサイエンス、内閣府では食の安全、内閣官房では医療分野のサイバーセキュリティを担当。国際的には、JICA日タイ国際保健共同プロジェクトのチーフ、WHOインターンも経験。
退官後は、日本大手IT企業にて保健医療分野の新規事業開発や投資戦略に携わり、英国VCでも実務経験を積む。また、複数社起業し、医療DX・医療AI、デジタル医療機器開発等に取り組むほか、東京都港区に内科クリニックを開業し、社外取締役としても活動。
現在、大阪大学大学院医学系研究科招へい教授、岡山大学研究・イノベーション共創機構参事、ケンブリッジ大学ジャッジ・ビジネススクールAssociate、広島大学医学部客員教授として、学術・教育・研究に従事。あわせて、医療者のための医療AI教室「Medical AI Nexus」を主宰。
社会医学系指導医・専門医・The Royal Society of Medicine Fellow

コメント

コメントする

目次