コンピュータにとって「초파리」(ショウジョウバエ)は最初から数値である。文字ごとに決まった番号(ユニコード)があり、その番号をバイトとして保存する。ニューラルネットワークに入れるには、文をトークンに分け、トークンごとに番号を付け、番号を意味を持つベクトル(埋め込み)に変え、順序の情報を加えなければならない。36文の小さな韓国語コーパスで、すべての段階を自分で計算する。
ハングル音節の番号 = 0xAC00 + (初声 × 21 + 中声) × 28 + 終声ユニコード標準 3.12節
文字単位で分けるとトークンが多くなりすぎ、単語単位で分けると初めて見る単語を扱えない。BPEはコーパスで最もよく隣り合って出てくる2つの断片を1つにマージすることを繰り返し、その中間を見つける。
BPEで60回マージした後、コーパスに出てくるトークンを集めると辞書になる。トークンごとに辞書の枠番号が付く。辞書にないトークンは「不明」の番号を受け取る。
番号54と55は隣り合う番号だが、意味はまったく関係がない。そこで番号ごとに複数の枠を持つベクトルを付ける。似た使われ方をする単語どうしが近い座標を持つようにするのが目標だ。ここでは「同じ文の中で±2語以内に一緒に出てきた回数」から、55個の単語それぞれに8次元のベクトルを作った。
「一緒に出てくる単語が似ていれば意味も似ている」という考えは古くからある。単語と文書の出現表を特異値分解で縮約し、隠れた意味構造を見つける潜在意味解析(LSA)が代表的な初期の手法である [R2]。このページでは、単語どうしが一緒に出てきた回数の表に log(1 + 回数) を取り、固有値分解で8次元を取り出した。今日の言語モデルは、埋め込みを次のトークンを当てる学習の一部として同時に学ぶ。セクション5の位置情報もこのベクトルに加える。
トークンを順序なしに袋に入れて数えると(トークンの袋)、順序が消える。韓国語は助詞が役割を示すので、語順が変わっても意味が同じことが多いが、いつもそうとは限らない。
テキスト → トークン → 番号 → ベクトル(+位置) → トランスフォーマー(3-8) → 次のトークンの確率。最も単純な言語モデルは、直前の単語だけを見て次の単語を数える。このコーパスで実際に計算してみて、トランスフォーマーがさらに何をするのかを見る。
どちらのコードも、Colabに標準でインストールされているライブラリだけを使う。「ノートブック(.ipynb)をダウンロード」したあと、Colabでファイル → ノートブックをアップロードで開くか、コピーして新しいノートブックのセルに貼り付ける。
ユニコード・UTF-8、ハングル字母の公式、BPEの学習と適用、トークン番号、共起回数から作った埋め込み、直前の単語からの確率を、ライブラリなしで計算する。自分のデータに替えるには CORPUSを置き換える。
実務用ライブラリで文を「文 × トークン」の行列に変え、単語単位と文字断片単位を比べ、TF-IDFと潜在意味解析で似た文を探す。
ChatGPT、Qwen、ClaudeのようなAIアシスタントに貼り付けるプロンプトである。「コピー」を押すと、プロンプトのあとに選んだコードが一緒に付く。〔 〕の中を自分の状況に書き換えて使えばよい。
AIの答えは出発点にすぎない。提案された論文・数値・ライブラリ関数は、必ず原文と公式ドキュメントで確認する。コンテストや論文でAIの助けを借りた場合は、主催者や学術誌の規定に従って、使用した事実と範囲を明らかにする。
本文の黄色い点線の下線と同じ辞書である。シリーズ全体で同じ表記を使う。セクション名を押すと最初に出てきた場所へ移動する。
たとえは理解の第一歩だが、誤解の種にもなる。ショウジョウバエ・脳のたとえには強さを示した。直接 実際に同じことをしているという根拠がある · 部分 一部の性質だけが似ている · なし 対応するものが知られていない
| 概念 | 日常のたとえ | ショウジョウバエ・脳のたとえ | たとえが外れるところ |
|---|---|---|---|
| ユニコード | 世界中の文字に付けた住民登録番号 | なし | 番号は文字を区別するだけで、文字どうしがどれだけ似ているかは教えてくれない |
| BPE | よく一緒に使う語を略語にする(「초파리」をひとかたまりに) | なし | 略語は人が意味を見て作るが、BPEは回数だけを見てマージする。意味と関係のない断片もできる |
| トークン番号 | 図書館の本の請求記号 | なし | 請求記号は主題ごとにまとまるが、トークン番号はカナダラ順(韓国語の辞書順)か登場順にすぎない |
| 埋め込み | 地図上の座標:近い町どうしは似ている | 部分 ショウジョウバエのキノコ体は、においを多数のケニオン細胞の活性パターン(ベクトル)で表す | キノコ体はにおいを広く散らして区別しやすくする(スパース)が、埋め込みは数百次元に密に詰め込む。作り方も異なる |
| トークンの袋 | 文を単語カードに切って封筒に入れる | なし | 封筒からカードを取り出しても、元の順序はわからない。韓国語では助詞のカードが一部の手がかりになる |
| 次のトークンの確率 | しりとりで次に来る言葉を推測する | 部分 脳も次に来る語音を予測するという研究がある | 脳の予測は意味・状況・身体の経験と絡み合っている。モデルは文字断片の統計だけで計算する |
E-1 著者紹介 · E-2 学術参考文献 · E-3 図の参考資料
講師、実務OJT担当者、チューターのための運営ガイドである。時間は目安なので、実際の授業に合わせて調整する。
| 対象 | 顧客の問い合わせ・レビュー・文書などのテキストデータを扱いたい大学生・実務者。言語モデルがテキストをどう受け取るのか知りたい人 |
|---|---|
| 前提知識 | ベクトルとコサイン類似度の概念。3-8の位置情報を知っているとセクション5・6がわかりやすい |
| 学習目標 | ① 文字 → ユニコード → バイトを説明できる ② BPEがトークン辞書を作る過程と、初めて見る単語を扱う方法を説明できる ③ 番号・埋め込み・位置情報がそれぞれなぜ必要かを説明できる |
| 所要時間の目安 | 読む 35〜45分 · デモ 20分 · Colab実習 25分 (コード1 15分、コード2 10分) |
導入 5分(セクション1 絵文字は4バイト) → セクション2 BPE 15分 → セクション3・4 15分 → セクション5 dog bites man 5分 → セクション6 5分 → 確認問題 5分。
自分のチームの文書30文でコーパスを作る 15分 → コード1のCORPUSを置き換えてBPE・埋め込みを再計算 30分 → コード2で似た問い合わせを探す 25分 → 「不明」トークンと個人情報の扱いを議論 20分。
入門者はセクション1・2・4だけ。中級者にはBPEのマージを3回手作業でやらせてから(単語の頻度を数える → 最も多いペアを探す)、セクション2の規則一覧と照らし合わせる。
| セクション | 立ち止まって投げかける質問 | 操作のコツ |
|---|---|---|
| 1 ユニコード | 「同じ文字数でも保存サイズが違うのはなぜ?」 | ハングルの文 → 「Hello 초파리」 → 絵文字入りの文の順 |
| 2 トークン分割 | 「なぜ語尾の'한다'が最初にマージされたのだろう?」 | 0 → 60回、続いて初めて見る単語を含む文 |
| 3 トークン番号 | 「54番が5番より大きいことに意味はあるだろうか?」 | 「AI가 꽃을 본다」で「不明」トークンを指摘する |
| 4 埋め込み | 「'昆虫'を教えたことはないのに、なぜ昆虫どうしが集まったのだろう?」 | 초파리는 → 신경망은 の順に、近傍の単語の性格を比べる |
| 5 位置情報 | 「韓国語は語順が自由なのに、なぜ位置情報が必要なのだろう?」 | 3つの比較を順に押す |
| 6 モデルの処理 | 「直前の単語1つだけを見るモデルの弱点は?」 | 「초파리는」と「꿀벌은」(ショウジョウバエは/ミツバチは)の確率を比べる |
| 誤解 | 正しい説明 | 見せる場面 |
|---|---|---|
| トークン = 単語 | トークンはコーパスによって決まる断片である。文字のこともあれば、単語のことも、その中間のこともある | セクション2 |
| ハングル1文字は1バイト | UTF-8ではハングル音節は3バイトである | セクション1 |
| トークン番号が近ければ意味も近い | 番号は辞書の枠の位置にすぎない。意味は埋め込みに込められる | セクション3・4 |
| 埋め込みが近ければ同義語である | 一緒に使われる単語も近くなる。「似ている」の意味は作り方によって決まる | セクション4「신경망은」 |
| モデルはテキストを人間のように理解する | 番号とベクトルで次のトークンの確率を計算する。理解しているかどうかは別に問うべき問題である | セクション6 |
0xAC00 + (0 × 21 + 0) × 28 + 1 = 0xAC01.
ハングル3文字 × 3 + 空白 1 + 絵文字 4 = 14バイト。
コーパスのすべての単語について、隣り合う2つの断片のペアを、その単語が出てきた回数だけ数えて足し合わせる。最も大きいペアを1つにマージする。
単語単位では辞書にないので、丸ごと「不明」になる。BPEでは ["초파리", "들", "이"] のように既知の断片に分けられる。
どちらも {dog:1, bites:1, man:1} で同じになる。順序を区別するには位置情報が必要である。
コード1のCORPUSに「나비는 꽃을 좋아한다」(チョウは花が好きだ)、「나비는 날개가 있다」(チョウには羽がある)を加えて再実行する。「나비는」に最も近い単語を確認し、セクション4の説明と結びつけて理由を書く。
コード1のbpe_trainでマージ回数を10・30・60・100と変えながら、辞書サイズと1文あたりの平均トークン数を表にまとめる。辞書サイズとトークン数のトレードオフを説明し、業務文書ならどの値を選ぶか根拠を書く。
| 入門者 | セクション1の字母の公式とセクション3は飛ばしても流れは途切れない |
|---|---|
| 発展 | BPE以外のトークン分割の方法(ユニグラム言語モデル、形態素解析器ベース)を調べて比較させる。調べた論文は原文で確認する |
| さらに学ぶ | Sangsun Ahn『ビジネスのためのデータサイエンス』講義案 (データサイエンス全般) · STEP [K-デジタル] 人工知能 自然言語処理 (この回と直接つながる) · STEP [K-デジタル] フィンテックデータ分析の基礎 (3-6とつながる) |
| 講師用資料 | 確認問題の採点基準と課題の解答例は 教育者用解答ページ (3-5) で見られます |
「3-5 テキスト」の回を最後まで読みました。研究室のみんなが一言ずつまとめてくれます。