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

無料レッスン

言語モデルが次の単語を選ぶ仕組み

このレッスンのあとで: 言語モデルが次の単語をどう選び、どこで間違えるかを説明できる。

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

自信たっぷりの間違った答え

新しく入ったスタッフが、チャットボットに日曜日の開店時刻を尋ねます。答えはすぐ、ていねいで迷いのない文で返ってきました。けれど、その時刻は間違っていました。

何かが壊れたわけではありません。モデルは、作られたとおりに動いただけです。このレッスンでは、それが何なのかを、手で追えるほど小さなモデルで見ていきます。

このレッスンのゴール

メモ

言語モデルが次の単語をどう選び、どこで間違えるかを説明できる。

キーワード

ことばいみれい
言語モデル次のトークンの確率を出すプログラム
トークンモデルが扱う文字の切れ端で、単語やその一部
確率どれだけ起こりやすいかを、0から1で表したもの
バイグラム隣り合った2つのトークンの組the shop
学習用の文章モデルが学ぶもとになる文章
ハルシネーションすらすら読めるのに、本当ではない文

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

文章はトークンになる

モデルは、人のように文字を読むわけではありません。まず文章をトークンに切ります。大きなモデルのトークンは、よく出る単語や、めずらしい単語の一部です。

英語は空白で単語が分かれますが、日本語には空白がありません。そのため、日本語の文は1文字ずつや、単語の切れ目を学んだ道具で切ります。ラボの小さなモデルは英語の文章を使い、空白で切ります。

一文をトークンに切る

コード: python
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の後ろ

次のトークン回数確率
shop33 / 9 = 0.33
desk22 / 9 = 0.22
hour11 / 9 = 0.11
bikes、customer、door1ずつ0.11ずつ
合計9丸めの差を除いて 1.00

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

次の単語を自分で数える

コード: python
# 短い文章で、ある単語の次に来る単語を数えます。
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つの文を作ります。学習用の文章に近づきましたか。さらに前まで見るモデルは文がうまくなるのに、それでも話を作ってしまう理由を説明しましょう。

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

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