言葉を数にして、意味の近さを測る
単語の埋め込みとは、単語を数の列(ベクトル)で表し、意味の近い語を近くに置く方法です。検索、翻訳、チャットボットの土台になっていますが、間違いもします。
レンタサイクル店の質問に、チャットボットが答えます。語の近さをどう測るのか、そして、どんなときに自信たっぷりに間違えるのかを、小さな例で見ます。
このレッスンのゴール
メモ
単語がベクトルになる仕組みと、モデルが間違える場面を説明できる。
キーワード
| ことば | いみ |
|---|---|
| 埋め込み | 単語を、意味の近さが分かる数の列にしたもの |
| 共起 | 2つの語が、近くにいっしょに出ること |
| アテンション | 文のどの語に注目するかに、重みをつける仕組み |
| バイアス | 学習用の文章の偏りが、答えに出ること |
| ハルシネーション | すらすら読めるのに、本当ではない文 |
学生が入力するセルは、このプレビューでは空白です。
意味は、まわりに出る語で決まる
似た意味の語は、似たまわりの語といっしょに出ます。「自転車」も「バイク」も、「乗る」「借りる」の近くに出ます。
語ごとに、まわりの語がいっしょに出た回数(共起)を数えます。その回数の列が、語のベクトル、つまり埋め込みの一番素朴な形です。
例: 語のまわりに出た語の回数
| 語 | 乗る | 借りる | 食べる | 飲む |
|---|---|---|---|---|
| 自転車 | 3 | 2 | 0 | 0 |
| バイク | 2 | 2 | 0 | 0 |
| パン | 0 | 0 | 3 | 1 |
| 牛乳 | 0 | 0 | 1 | 3 |
学生が入力するセルは、このプレビューでは空白です。
近い語をコサイン類似度で探す
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になる仕組みです。大きなモデルの中で、これがくり返し使われています。
例: 「それ」が指すものは文で変わる
| 文 | 「それ」が指すもの |
|---|---|
| 自転車は箱に入らない。それは大きすぎる。 | 自転車 |
| 自転車は箱に入らない。それは小さすぎる。 | 箱 |
学生が入力するセルは、このプレビューでは空白です。
注目の重みの合計を確かめる
# 「それ」が、文のほかの語へ向ける注目の重みです。作った例の数です。
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のままか確かめてください。
学習用の文章の偏りが、答えの偏りになる
モデルは、学習用の文章にある形をくり返します。文章の中で、ある職業がいつも「彼」と並んで出れば、ベクトルもそのとおりに近くなります。
これは現実がそうだからではなく、文章がそう書いてあったからです。これが、データから来るバイアスです。
例: 作った文章の中の並び方
| 語 | 「彼」と並んだ回数 | 「彼女」と並んだ回数 |
|---|---|---|
| 店長 | 5 | 1 |
| 受付 | 1 | 5 |
学生が入力するセルは、このプレビューでは空白です。
もっともらしい作り話が出る理由
モデルは、来やすい次の語を選んで文を作ります。本当かどうかを調べる手順は、その中にありません。だから、ハルシネーションと呼ぶ、すらすら読めるのに本当ではない文が出ます。
学習用の文章にない質問にも、何かを答えます。答えが分からない、とは言わないことがよくあります。
モデルが間違える場面と確かめ方
| 間違い | 原因 | 確かめ方 |
|---|---|---|
| ない出典を挙げる | 調べる手順がない | 出典を自分で開く |
| 計算が合わない | 数を予測しているだけ | 数を計算し直す |
| 偏った答え | 文章の偏り | 別の人を考えて試す |
| 古い情報 | 学習した時点で止まっている | 日付のある出典で確かめる |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
モデルが自信を持って答えたので、正しいと考えがちです。口調と正しさは別です。もっともらしい文は、本当でなくても作れます。大事なことは、出典や計算で確かめます。