クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

単語の埋め込みと言語モデルの限界

このレッスンのあとで: 単語がベクトルになる仕組みと、モデルが間違える場面を説明できる。

60分のレッスンコマンド1件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

言葉を数にして、意味の近さを測る

単語の埋め込みとは、単語を数の列(ベクトル)で表し、意味の近い語を近くに置く方法です。検索、翻訳、チャットボットの土台になっていますが、間違いもします。

レンタサイクル店の質問に、チャットボットが答えます。語の近さをどう測るのか、そして、どんなときに自信たっぷりに間違えるのかを、小さな例で見ます。

このレッスンのゴール

メモ

単語がベクトルになる仕組みと、モデルが間違える場面を説明できる。

キーワード

ことばいみ
埋め込み単語を、意味の近さが分かる数の列にしたもの
共起2つの語が、近くにいっしょに出ること
アテンション文のどの語に注目するかに、重みをつける仕組み
バイアス学習用の文章の偏りが、答えに出ること
ハルシネーションすらすら読めるのに、本当ではない文

学生が入力するセルは、このプレビューでは空白です。

意味は、まわりに出る語で決まる

似た意味の語は、似たまわりの語といっしょに出ます。「自転車」も「バイク」も、「乗る」「借りる」の近くに出ます。

語ごとに、まわりの語がいっしょに出た回数(共起)を数えます。その回数の列が、語のベクトル、つまり埋め込みの一番素朴な形です。

例: 語のまわりに出た語の回数

語乗る借りる食べる飲む
自転車3200
バイク2200
パン0031
牛乳0013

学生が入力するセルは、このプレビューでは空白です。

近い語をコサイン類似度で探す

コード: python
import math

vectors = {
    "自転車": [3, 2, 0, 0],
    "バイク": [2, 2, 0, 0],
    "パン": [0, 0, 3, 1],
    "牛乳": [0, 0, 1, 3],
}

def cosine(a, b):
    dot = 0
    size_a = 0
    size_b = 0
    for n in range(len(a)):
        dot = dot + a[n] * b[n]
        size_a = size_a + a[n] ** 2
        size_b = size_b + b[n] ** 2
    return dot / (math.sqrt(size_a) * math.sqrt(size_b))

target = "パン"
for word in vectors:
    if word != target:
        print(word, round(cosine(vectors[target], vectors[word]), 2))
# target を "自転車" に変えて、もう一度実行してください。

近さを端末で計算する

コマンド
docker exec jupyter python3 -c "print(round(6 / (10 ** 0.5 * 10 ** 0.5), 2))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

近さは、コサイン類似度で測る

前の回で学んだコサイン類似度を、語のベクトルに使います。1に近いほど、似たまわりに出る語です。

「パン」と「牛乳」は、どちらも「食べる」「飲む」の近くに出るので、類似度は0.6です。「パン」と「自転車」は、共通のまわりの語がなく、0です。

アテンションは、文のどこを見るかを決める

同じ語でも、文によって意味が変わります。「それ」が何を指すかは、まわりの語で決まります。

アテンションは、1つの語を表すとき、文のほかの語に注目の重みをつけて、重みの合計が1になる仕組みです。大きなモデルの中で、これがくり返し使われています。

例: 「それ」が指すものは文で変わる

文「それ」が指すもの
自転車は箱に入らない。それは大きすぎる。自転車
自転車は箱に入らない。それは小さすぎる。箱

学生が入力するセルは、このプレビューでは空白です。

注目の重みの合計を確かめる

コード: python
# 「それ」が、文のほかの語へ向ける注目の重みです。作った例の数です。
weights = {"自転車": 0.7, "箱": 0.2, "入らない": 0.1}
total = 0
for word in weights:
    total = total + weights[word]
print(round(total, 2))
# 自転車を 0.5、箱を 0.4 に変えて、合計が1のままか確かめてください。

学習用の文章の偏りが、答えの偏りになる

モデルは、学習用の文章にある形をくり返します。文章の中で、ある職業がいつも「彼」と並んで出れば、ベクトルもそのとおりに近くなります。

これは現実がそうだからではなく、文章がそう書いてあったからです。これが、データから来るバイアスです。

例: 作った文章の中の並び方

語「彼」と並んだ回数「彼女」と並んだ回数
店長51
受付15

学生が入力するセルは、このプレビューでは空白です。

もっともらしい作り話が出る理由

モデルは、来やすい次の語を選んで文を作ります。本当かどうかを調べる手順は、その中にありません。だから、ハルシネーションと呼ぶ、すらすら読めるのに本当ではない文が出ます。

学習用の文章にない質問にも、何かを答えます。答えが分からない、とは言わないことがよくあります。

モデルが間違える場面と確かめ方

間違い原因確かめ方
ない出典を挙げる調べる手順がない出典を自分で開く
計算が合わない数を予測しているだけ数を計算し直す
偏った答え文章の偏り別の人を考えて試す
古い情報学習した時点で止まっている日付のある出典で確かめる

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

モデルが自信を持って答えたので、正しいと考えがちです。口調と正しさは別です。もっともらしい文は、本当でなくても作れます。大事なことは、出典や計算で確かめます。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。