自信たっぷりの間違った答え
新しく入ったスタッフが、チャットボットに日曜日の開店時刻を尋ねます。答えはすぐ、ていねいで迷いのない文で返ってきました。けれど、その時刻は間違っていました。
何かが壊れたわけではありません。モデルは、作られたとおりに動いただけです。このレッスンでは、それが何なのかを、手で追えるほど小さなモデルで見ていきます。
このレッスンのゴール
メモ
言語モデルが次の単語をどう選び、どこで間違えるかを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 言語モデル | 次のトークンの確率を出すプログラム | |
| トークン | モデルが扱う文字の切れ端で、単語やその一部 | |
| 確率 | どれだけ起こりやすいかを、0から1で表したもの | |
| バイグラム | 隣り合った2つのトークンの組 | the shop |
| 学習用の文章 | モデルが学ぶもとになる文章 | |
| ハルシネーション | すらすら読めるのに、本当ではない文 |
学生が入力するセルは、このプレビューでは空白です。
文章はトークンになる
モデルは、人のように文字を読むわけではありません。まず文章をトークンに切ります。大きなモデルのトークンは、よく出る単語や、めずらしい単語の一部です。
英語は空白で単語が分かれますが、日本語には空白がありません。そのため、日本語の文は1文字ずつや、単語の切れ目を学んだ道具で切ります。ラボの小さなモデルは英語の文章を使い、空白で切ります。
一文をトークンに切る
sentence = "店は9時に開きます。"
# 1文字ずつに分けると、こうなります。
print(list(sentence))
print(len(sentence), "文字")
# 単語に分けた例です。日本語には空白がないので、
# 実際には分けるための道具を使います。
tokens = ["店", "は", "9", "時", "に", "開き", "ます", "。"]
print(len(tokens), "トークン")
# 自分で一文を作り、トークンに分けて数えてください。
数から次の単語の確率を出す
バイグラムのモデルが学ぶことは1つだけです。どのトークンの後ろに、どのトークンが来やすいかです。学習用の文章を順に見て、隣り合う組をすべて数えます。
ある単語の後ろの確率は、それぞれの数を、その単語の後ろに何かが来た回数で割って出します。bigram.py は、店についての短い英語の文章で、単語 the についてこれを行います。
theの後ろに来る単語を数える
docker exec jupyter python3 steps/bigram.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: theの後ろ
| 次のトークン | 回数 | 確率 |
|---|---|---|
| shop | 3 | 3 / 9 = 0.33 |
| desk | 2 | 2 / 9 = 0.22 |
| hour | 1 | 1 / 9 = 0.11 |
| bikes、customer、door | 1ずつ | 0.11ずつ |
| 合計 | 9 | 丸めの差を除いて 1.00 |
学生が入力するセルは、このプレビューでは空白です。
次の単語を自分で数える
# 短い文章で、ある単語の次に来る単語を数えます。
text = "電車 は 遅れ ます 。 電車 は 混み ます 。 バス は 遅れ ます 。"
words = text.split()
word = "は"
counts = {}
total = 0
for n in range(len(words) - 1):
if words[n] == word:
after = words[n + 1]
if after in counts:
counts[after] = counts[after] + 1
else:
counts[after] = 1
total = total + 1
for after in counts:
print(word, after, counts[after], "/", total)
# word を "遅れ" に変えてください。次に来そうな単語は何ですか。
書くことは次のトークンを選び続けること
文を書くとき、モデルは次のトークンを1つ選びます。確率に重みをつけて、ランダムに選ぶことがよくあります。そして新しいトークンから、また次を選びます。
このくり返しの中に、文が本当かどうかを確かめる手順はありません。大きなモデルは、1つでなく何千もの前のトークンを見るニューラルネットワークです。膨大な文章で学んでいますが、それでも、来やすい次のトークンを選んでいます。
数をもとに4つの文を書く
docker exec jupyter python3 steps/generate.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
言語モデルは事実を調べて伝えている、と考えがちです。実際は、来やすい次のトークンを出しています。来やすい言葉がたまたま本当なら、答えは正しくなります。そうでなければ、同じ自信のある口調で間違えます。だから、大事なことは確かめてください。
学習用の文章が来やすさを決める
モデルは、学習用の文章にある形しかくり返せません。この文章には「the shop」が3回あるので、話題が何であっても shop に手をのばします。
大きなモデルは、人についても同じことをします。文章の多くが、ある仕事をある性別と、ある国をある犯罪と結びつけていれば、それをくり返します。これがデータから来るバイアスで、1つの答えだけを見てもなかなか気づけません。
答えの確かめ方
答えは、確かめない速い書き手が書いた下書きだと思って扱います。事実の出どころを尋ね、その出典を自分で開きます。存在しない出典は、危ない合図です。
数は自分で計算し直します。同じ質問を別の言い方でして、比べます。顧客の名前のような個人のデータは、組織がその道具での利用を認めていない限り、貼りつけてはいけません。
さらに挑戦: 2語前まで見る
generate.py の文章をノートブックのセルに写し、モデルが前の1語でなく2語を見るようにしてください。「the shop」のような組ごとに、次の単語を数えます。
同じ種で4つの文を作ります。学習用の文章に近づきましたか。さらに前まで見るモデルは文がうまくなるのに、それでも話を作ってしまう理由を説明しましょう。