SONUB
JA English 한국어 日本語 中文 हिन्दी বাংলা اردو Español Português Français Deutsch Русский العربية Bahasa Indonesia Tiếng Việt ไทย Türkçe

通知を有効にする方法

このブラウザーまたはアドレスでは通知を利用できません。対応ブラウザーで安全な接続のSONUBサイトを開いてください。

通知がブロックされている場合は、ブラウザーの設定で許可してください。

  1. アドレスバー横のサイト設定、またはブラウザーのサイト設定を開き、このサイトの通知を許可に変更してください。
  2. 端末の設定でブラウザーの通知を許可し、おやすみモードや集中モードを確認してください。
  3. SONUBに戻ってページを再読み込みしてください。通知が有効になるとベルは表示されなくなります。

iPhoneやiPadではSONUBをホーム画面に追加し、そこから開いて通知を許可してください。

ログイン ログアウト 表示テーマ 標準テーマ ダークテーマ ピンクテーマ チャット 1:1 チャット グループチャット 掲示板 お知らせ ニュース掲示板 ご意見掲示板 自己紹介 メインメニュー

さあ、あなただけの人工知能を作ってみましょう。

の前に、プロジェクトのフォルダー・・を自分で作ります。~/xslm に settings.json と prepare.py を書き、Q/A の文章を学習用と検証用に分けましょう。

単語のブロックが一列に並び、最後に空きマスがある。その上に高さのちがう棒がついた候補ブロックが3つあり、そのうち1つが選ばれて列の最後につながり、矢印が最初に戻ってまた次を選ぶ。
3

プロジェクト構成

~/xslmにソース、に資料、checkpointsにを置きます。常にこのフォルダーで実行します。

原文は一行にQ:質問とA:回答。prepare.pyは重複を除き5件ごとに1件を検証用に分けます。検証資料をのに混ぜず、個人情報でなく自作の例を使います。

フォルダー構成 — 各ファイルを誰がいつ作るか

~/xslm フォルダーは、すべて作り終えるとこうなります。

  • settings.json — 自分で書きます。すべてのが読む設定です。
  • data/raw.txt — 自分で書きます。元の質問と答えです。
  • data/train.txt・data/val.txt — prepare.py が作ります。学習用と検証用です。
  • data/tokenizer.json — tokenizer.py が作ります。語彙と合併規則です。
  • checkpoints/model.json — train.py が作り、学習するたびに更新します。重みと学習の状態です。
  • runner.log・runner.pid — をで起動するとできます。出力の記録とプロセス番号です。
  • 残りの .py ファイル — 自分で書きます。プログラムのソースです。
  • lab/ — 段階ごとの確認実験です(任意)。

ソースと資料と結果を分けておくと、何を消してよいかがはっきりします。data/・checkpoints/ に作られたファイルはいつでも作り直せますが、自分で書いたソースと raw.txt は作り直せないので、書き出して保管してください。

実行順序と作り直すもの — 何を変えたら何をやり直すか

ファイルは前から後ろへつながるので、前の方を変えたら後ろの方をすべて作り直します。

  • raw.txt を変えたら: prepare.py → tokenizer.py → チェックポイントを移して train.py。
  • settings.json を少しでも変えたら(merges・width・・steps・ のどれでも): 変えたのが merges なら tokenizer.py から、そうでなければすぐにチェックポイントを移して train.py。
  • 学習だけを追加したいなら: settings.json はそのままにして、 train.py --steps 50 のようにオプションで回数を決めます。チェックポイントから続けて学習します。
  • 学習を追加したら: 実行中の Runner を止めて起動し直さないと、新しい重みを読みません。

train.py はこの規則を自分で確かめます。チェックポイントに保存した設定全体・トークナイザー・資料の指紋が、今のものと1つでも違えば で止まります。変わった資料や設定で古い重みの学習を続けると、の意味や形がずれて、気づかないうちに壊れるからです。新しく始めるには、 checkpoints/model.json checkpoints/old.json のように古いファイルを移します。

データ形式が能力を作る — Q: … | A: …

raw.txt の1行は "Q: 質問 | A: 答え" です。prepare.py は " | A:" の前でするので、学習資料では2行になります。

  • Q: hi
  • A: hi friend.

はこの形を繰り返し見て、「Q: の行の次の行は A: で始まり、A: の後には答えらしい文章が来てから改行する」ことを学びます。生成するとき Q: 質問 の次の行に "A: " まで入れてあげると、モデルは学んだ習慣どおりに答えを続けて書きます。

形式は自由に決めてかまいません。[QUESTION]…[/QUESTION]、[ANSWER]…[/ANSWER] のように印をつけてもかまいません。守るべきことは一貫性ただ1つです。

  • すべての行が同じ印と同じ順序を使います。
  • 同じ意味は同じ言葉で書きます。例えば 電話・Tel・☎ をすべて TEL: に統一します。
  • 形式を変えたら、その形式を使うも変えます。 では generate.py の基本と xchat.py の "Q: … A: " がこの形式に結びついています。

入力から出力への形が資料にたくさんあってこそ、その仕事を学びます。文章を並べるだけなら続き書きを、質問→答えなら答え方を、文書→要約なら要約を学びます。

良い資料と悪い資料 — 量・品質・権利

モデルは見たものだけをまねます。韓国語だけを聞いて育った人が日本語を話せないのと同じです。だから資料こそがモデルです。

  • エンコーディング: 必ず で保存します。他のエンコーディングだと文字が化けます。
  • 良い資料: 形式がそろった質問と答え、情報のこもった自然な文。
  • 悪い資料: コード・ログだけの文章、絵文字・アドレスが多すぎる文章、壊れた文、同じ文の繰り返し。
  • 整理: 前後の空白と空行を消し、同じ行は1回だけ残します。prepare.py がこの仕事をします。
  • 多様性: 同じ答えに対して、質問をいろいろな言い方で書いてみます(hi・hello・hey)。そうすることで、初めて見る質問にも答えられる可能性が生まれます。
  • 権利と個人情報: 自分に使う権利がある文章だけを使い、実際の名前・電話番号の代わりに作った例文を使います。

量は思ったよりたくさん必要です。おおよそ質問と答え3,000組くらいで形式をまね始め、1万組くらいで形式が安定します。XSLM の15行は、全体の過程が実際に動くかを確かめるための、ごく小さな練習資料です。最初はこのように小さな偽の資料で最後まで動かしてから、資料を増やします。

学習資料と検証資料 — 初めて見る試験用紙を残しておく

学習資料だけで点数をつけると、暗記したのか学んだのかを区別できません。そこで一部を切り離し、学習に使わない検証資料()にします。学習の損失は下がるのに検証の損失が上がったら、暗記()を始めたという合図です。

prepare.py はこう分けます。

  • 重複を消した行に0から番号をつけます。
  • 番号を5で割った余りが0の行(0・5・10番目)を検証用、残りを学習用にします。基本資料の15行は、学習12行・検証3行になります。
  • に変える前に、質問と答えの1組を丸ごと分けます。文字単位で切ると、1組の前半が学習に、後半が検証に入り、試験問題が漏れてしまいます(データ漏えい)。
  • トークナイザーも学習資料だけを見て学びます。検証資料は最後の試験まで誰も見ません。

資料がとても大きいときは、全体のトークンの最後の1%を切り出して検証用に使うこともあります。資料が小さいときは、XSLM のように質問と答えの組単位で分けるほうが安全です。

大きな資料は先にトークン番号に変えておく

XSLM は train.py を実行するたびに train.txt 全体をトークン番号に変えます。資料が数百文字なので一瞬です。資料が数十 になると毎回変えるのは無駄なので、1回だけ変えてファイルに保存しておきます。

  • トークン番号を uint16(2の整数)で保存します。語彙が 65,536個より少なければ2バイトに収まります。
  • 文章ではなく数字の配列なので、train.bin・val.bin というファイルになります。
  • 学習するときは numpy.memmap で、ファイルをすべてに載せずに必要な部分だけを読みます。

資料がもっと大きくなったら、複数のファイルに分けて順に学習します。流れは同じです。文章 → トークン番号 → 固定長の区間 → 学習。

自分の資料に変える — 日本語の質問と答えで試す

過程を一度終えたら、raw.txt を自分の資料に変えてみます。

  • 1行に "Q: 質問 | A: 答え" を1つずつ、互いに違う行を5行以上書きます。prepare.py の assert が形式と行数を検査します。
  • 答えは短く書きます。 が12トークンなので、モデルは最後の12トークンしか見ません。文字ベースの では日本語は最初1文字が1トークンなので、質問と答えが長いと前の部分が見えません。
  • 作り直し: python3 prepare.py → python3 tokenizer.py → mv checkpoints/model.json checkpoints/old.json → python3 train.py。
  • 学習資料にない文字は、トークナイザーが知らない文字(0番)に変えます。質問に使う文字は資料にも入れておいてください。

日本語のように文字の種類が多い言語は、語彙が大きくなり、同じペアがあまり繰り返されないので、合併が早く止まりやすいです。そういうときは行を増やし、merges を増やしてみます。

入力して実験

フォルダーを作り、下の各ソースを同名ファイルに入力して保存します。.pyファイルは、settings.jsonとraw.txtはを使います。の句読点に注意してprepare.pyを実行します。

mkdir -p ~/xslm/data ~/xslm/checkpoints
cd ~/xslm
nano settings.json
nano data/raw.txt
micro prepare.py
python3 prepare.py
wc -l data/train.txt data/val.txt
ターミナルで実習する
settings.json手入力する完全なソース

widthは幅、contextは文脈長、learning_rateは更新量です。

{
    "width": 8,
    "context": 12,
    "merges": 12,
    "steps": 20,
    "learning_rate": 0.03,
    "seed": 7,
    "tokens": 24,
    "max_tokens": 64,
    "port": 8765
}
data/raw.txt手入力する完全なソース

一行に質問と回答を一組。短い自作の英語例です。

Q: hello | A: hello friend.
Q: hi | A: hi friend.
Q: name | A: i am xslm.
Q: sun | A: the sun is warm.
Q: cat | A: a cat can nap.
Q: dog | A: a dog can run.
Q: red | A: red is a color.
Q: blue | A: blue is a color.
Q: learn | A: i learn from text.
Q: code | A: i can learn code.
Q: moon | A: the moon is in the sky.
Q: rain | A: rain is water.
Q: book | A: i can read a book.
Q: tea | A: tea is warm.
Q: bye | A: bye friend.
prepare.py手入力する完全なソース

UTF-8読込、重複除去、文単位分割、学習・検証の保存を行います。

from pathlib import Path


lines = [line.strip() for line in Path('data/raw.txt').read_text(encoding='utf-8').splitlines() if line.strip()]
lines = list(dict.fromkeys(lines))
assert len(lines) >= 5, 'write at least five different Q/A lines'
assert all(' | A:' in line and line.startswith('Q:') for line in lines)
train = [line for i, line in enumerate(lines) if i % 5 != 0]
val = [line for i, line in enumerate(lines) if i % 5 == 0]
for name, rows in [('train', train), ('val', val)]:
    text = '\n'.join(row.replace(' | A:', '\nA:') for row in rows) + '\n'
    Path('data/' + name + '.txt').write_text(text, encoding='utf-8')
    print(name, len(rows))

コードを1行ずつ読み解く

自分で入力したソースを小さく分けて読みます。左の数字はファイルの実際の行番号です。の line の数字と照らし合わせながら読んでください。

prepare.py 元の資料の読み込みと重複の削除

from pathlib import Path


lines = [line.strip() for line in Path('data/raw.txt').read_text(encoding='utf-8').splitlines() if line.strip()]
lines = list(dict.fromkeys(lines))

Path(…).read_text(encoding='utf-8') でファイル全体を文字として読み、splitlines() で行ごとに分けます。内包表記 [line.strip() for line in … if line.strip()] は前後の空白を消し、空行は捨てます。dict.fromkeys(lines) は行をに入れて重複をなくしますが、 のは入れた順序を守るので、最初に出てきた順序がそのまま残ります。set を使うと順序が実行ごとに変わり、学習・検証の分け方が変わることがあります。

prepare.py 形式の検査

assert len(lines) >= 5, 'write at least five different Q/A lines'
assert all(' | A:' in line and line.startswith('Q:') for line in lines)

2つの assert が資料を検査します。互いに違う行が5行以上あってはじめて、検証用に1行以上を切り離せます。all(…) は、すべての行が Q: で始まり " | A:" を含むときだけ真です。1行でも違うと学習の形式が混ざるので、ここで止まるほうがよいのです。2つ目の assert にはメッセージがないので、AssertionError だけが表示されます。そのときは raw.txt の形式を見直してください。

prepare.py 学習・検証の分割

train = [line for i, line in enumerate(lines) if i % 5 != 0]
val = [line for i, line in enumerate(lines) if i % 5 == 0]

enumerate(lines) は(番号, 行)を順に渡します。i % 5 は番号を5で割った余りなので、0・5・10…番目の行が val、残りが train になります。15行なら12行と3行です。ランダムに選ばず規則で分けるので、何回実行しても同じ分け方になります。

prepare.py 2行の形式で保存

for name, rows in [('train', train), ('val', val)]:
    text = '\n'.join(row.replace(' | A:', '\nA:') for row in rows) + '\n'
    Path('data/' + name + '.txt').write_text(text, encoding='utf-8')
    print(name, len(rows))

train・val それぞれについて、行ごとに " | A:" を 改行 + "A:" に置き換えて質問と答えを2行にし、組を改行でつないでから、最後に改行を1つ足して保存します。最後の答えも改行で終わってはじめて、モデルは「答えの次は改行」をすべての答えで学べます。 は何組書いたかを表示します。

理解を確認

とを確認。例は学習12件、検証3件になります。

困ったとき

なら ~/xslmとls dataを確認。Pythonは空白4個。~/xslm-referenceは比較用で自動入力されません。

よくある質問

15行で本当に学習できますか?

過程が動くかを確かめるには十分ですが、使える会話にはまったく足りません。学習資料が12組しかないので、モデルはすぐにそのまま暗記しようとし、検証の損失はむしろ上がります(6段階「過学習」)。行を増やすほど、暗記より規則を学ぶ余地が大きくなります。

なぜ検証資料をトークナイザーの学習からも外すのですか?

トークナイザーも学習です。検証の文にだけ出てくる文字の組み合わせが合併規則に入ると、検証の文が学習の文より短くきれいなトークンに変わり、試験が簡単になってしまいます。実際のサービスで初めて見る文章を受け取る状況をまねるには、検証資料をすべての学習段階から外す必要があります。

assert エラー "write at least five different Q/A lines" が出ます。

prepare.py は、互いに違う行が5行以上ないと学習用・検証用に分けられません。空行と重複行は数えません。形式の assert に引っかかったら、すべての行が Q: で始まり、" | A:" が入っているかを見てください。空白まで同じである必要があります。

ガイドライン

人工知能

エージェントツール

バイブコーディング

AI活用

AI資格

AI授業

IT基礎

チャット

掲示板

制作

コミュニティ

その他

用語辞典

知らない言葉を選んでみましょう。やさしい説明と関連用語が見られます。

その用語はまだありません。

用語を選ぶと説明が表示されます。