ZENKEI AI ポッドキャスト、シーズン38は2023年2月22日に開催した ZOOMライブの模様です。
この日のテーマは「ChatGPT 話題ですね」です。
エピソード3は、パート1「Transformer を完璧に理解する!」の後半、スクラッチから GPT を実装!です。
このブラウザでは再生できません。
再生できない場合、ダウンロードは🎵こちら
ビデオ見れる人はこちらからご覧ください。
(以下は、OpenAI の Whisper を使って文字起こししたものを修正したものです。)
** 注:以下は未編集の草稿です **
こんにちは、ZENKEI AI FORUM です。
はい、皆さんこんばんはです。ZENKEI AI FORUM、2023年の2月22日、2月の回になります。
じゃあ スクラッチからGPTを実装するぜという話に行きます アンドレー さんは優しい人なので さっきも言ってるのに 今回のビデオに合わせてね 今回のビデオサイトに一応行くか今YouTubeのライブ配信で その上でYouTubeサイトに行ってますがこれね 山田電機ここあったらいいですねはい ライブでも山田さんのはいね こうサイトで説明してます 2時間1時間56分ね えっと ここ見ればわかるようにGoogleコラボノートブックもあれば GitHubのサイトもあればNanoGPTっていう名前をつけて このビデオで説明しているコードベースのコードを 共有しててっていうこともやってるですね すごく優しい人ですけども 僕はみんなにあの良かったよって言いますがそんな甘いことを僕はしない 皆さんにノートブックとかソースコードを共有僕はしません まああのチートしたい人は今のAndroidのサイトに行けばソースコード見れるんですが おすすめしませんと その代わりにっていうかね 僕はスクリーンショットを見せますで 皆さんにやってほしい 完璧にわかってほしいのは自分でタイプしろとか自分の手を使って 一文字一文字打ち込んでみようよとこのねチャットGPTとかコパイロットは 半分あーって言いかけた時点でもさっと全部埋めてくれるような 時代に一文字一文字自分でタイプしてみようよとそれを提案する そしたらあなたの中になんか売るものがあるよっていうのね気づいてほしいなぁ 時代に逆行してるね時代に喧嘩を売ってる感じですけども明らかにね えっとそれを真面目に推奨したいんですよ俺で 完璧にわかった感覚っていうのはそれで出てくるんですよねだってググっ 皆さんも経験あると思うけどもググってググってググってって言った結果って完璧にわかったって思えないじゃないですか 翌日忘れてるでしょググっただけのものっていうのだけどタイプしたら翌日は覚えてる まあいいやいいすぎるねはい実際に僕は2時間のアンドレイのビデオをどういうふうに見たかっていうと これジェレミーのファスト ai のビデオをどういうふうに見たかっていうのと同じなんだけどもこれ行けばわかるけど これ今解説のところだけどねコラボのノートブックに実際に行動を示しながら説明してるね で文字が読めるから画像がねきちんとあの配列だからその時配列っていう文字読めるからこれ一時停止したら タイプできるのねタイプしろと タイプしてタイプがあれば動かないしエラーが出るし動いたらで結果も彼きちんとミシン見せてるから 結構でシードもねあのランダム変数ねランダム j レーターのナンバージェネレーターのシードも同じ番号を使えば完璧に同じ結果が再現できるはずなんでねやってみようよ というのをお勧めします皆さんには前期 ai フォーラムの一気はみんなにそれを進めする でえっと僕2時間のビデオ見ましたが多分ね深追いはしてないもう自己満で終わっててもそれでいいと思ってるんだが 多分彼のビデオの中で紹介してたコードに間違いがあるみんなも見つけてみてくださいミステリー オタクみたいねねあのスクショね僕が 手でタイプした行動今からスクショをお見せしますアンドレの2時間のビデオを見たら全く同じものでてきます パート2とあるようにパート1っていうノートブックを作ってでアンドレのビデオに従ってちっちゃいところからどんどん大きく作っていって最後に 動くところまで行くみたいな形になってるそういうノートはパート1に入れてそれを一旦 ビデオ見終わった後によっしゃって完成形の部分だけ引っ張り出してきたのがこのパート2の僕のノートブックです けれどもねこれで全部 gpt の機能が全部入ってて 学習もできて8 インフランス実際にランゲージモデルなので文章の生成もできるコードができました ざっと見ていきますパイトウォッチを使ってますでえっとシードはねアンドレと同じ1337のシードを使ってっていうんでデータファイルは えっとまずはアンドレと同じシェックスピアのデータセットを彼のデータセットがあるんでそれを ダウンロードしてきてローカルにありますとインプットテキストってもらうでえっと彼がビデオで示しているようにトークナイザーは彼のビデオで説明しているのは キャラクターベースのトークナイザーキャラクターベースのランゲージモデルを作ってNLPをやってます なんでアルファベット abcde大文字小文字数字記号みたいなのが トークに入ってるものですデータローダーも自前でねgetバッチっていう関数で持ってくるということをやっている でモデルはの定義はビデオの中ずーっとやってますが8 結果だけねここで僕はタイプしたもんねまずヘッドっていうクラスを作っててそれは何かって言うと一番ユニットの部分で アテンションの8アテンションユニットの一番へあのコアの部分でキークエリーバリューの3つの チャンネルっていうのはそれを使って8入力から出力を出すっていう部分の実装なんだけれどもここに僕は多分 アンドレのコードに間違いがあるいうことを見つけた8ねノーマリゼーションの解説を彼自身がノートブックとは別のところで ほらこういうふうになっててっていうあのソフトマックス論文で言えばソフトマックスで分母にスクエアルートのディメンジョンが来ているところね あれがどうしてなのかっていうのを解説しているセクションがあってふむふむってやって実際ねあのバリアンスも計算してほらこれだとバリアンスだいたい 1ぐらいに収まるでしょって言ってノートブックに戻ってくるんだけどノートブックでは そのサイズの部分が違う値を使ってる と思われる皆さんもきちんと見てくださいまあねあのそのファクターの違いだけなんで c ディープラーニングのあのデバッグって難しいんですよねやっぱりねあのモデル自身がアジャスタブルパラメーターが一生懸命 ねパクター0.5違っても学習変数は その分コンペセントするように学習しちゃえばカバーできちゃうわけだからねいう難しいデバッグクリーンなデバッグっていうの難しいなぁっていうのは 8ね古いタイプのプログラマーは多分感じることだろうなと思いますが8これが見つけたバグっていう一点 もう1個ねさまざまなことねあのソースコードを見たらあこいつはアンドレイのコードそのまま使ってるなっていうのがバレちゃうよっていう部分でビードファワードクラスっていうのがあって ピードファワードレイヤーねその自分で実装してまあまあ単純なリニアレイヤーですけどもアンドレは スペルミスしてますフィードファワードの r が抜けてる 抜けてたパイトーちはねあの フォワードはフォワードなんだけども まあどうでもいいことですねこれはそれでもコンシステントにこうなっているからコードは当然動いているんだけどねそういうのがパイプしていると気づくね あのどうでもいい はいでこういうえっと必要なレイヤーを自前全部構成しといてそいつらを結合してこれが一番トップレベルの モデルのクラスが8倍グラム出発点は8直前の単語から次の単語っていうだけの シンプルなモデルから出発してるんでばそれバイグラムって言いますがバイグラムランゲージモデルから出発しててファイルあのクラスメーカーその引きずられているだけなんでこれが gpt ですgpt ですとあるいはトランスフォーマーのでコーダー部分ですと 8イニットとフォワードとあとインフェランスで使うジェネレイトっていうメソッドが追加されていますとで以上がコードのメインの部分 もうこれで終わりとでえっと 学習ループもあのねライトニングとか使わないで僕ライトニング普段使わないから 使われるとあーめんどくせーと思うんだけど8アンドレ独自のお手製の学習ループをフォーループを作ってね回してます でえっとさっき言ったよねあのシードも 彼のビデオと同じものでデータセットも同じものでデータスプリットもだから同じシードを使ってるんで同じで学習をさせたら ロスを表示してるんだけどもこれ完璧に同じになるはずなのねで 途中のステップね何回も学習してほらほら良くなっただんだん良くなったっていうふうにやっていく途中までスケールアップとかするまでは僕がパタパタってタイプで打って た結果と完璧に一致してたんだけどもなんか後半の1個か2個ぐらいからあの 下何桁がずれる例えばこれとかねえっとこれ最後のスケールアップした最後の学習ルーチンに相当しててえっとアンドレイのやつもあの同じ部分があるんだけどロスの値がねここに書いてあるんだけどノートに 1.4873にっていうふうにビデオではなってのが1.4834840 ちょっといいのねでこれがスケーリングの結果かなぁと思ったりもしたり思わなかったりもしたり あとだから微妙にシードも同じなんだけど微妙に違うようにえっと このね推論実際のサンプルで生成させた8文章も途中までは完璧に一致してたんだけども 最後の8トレーニングの1回2回分ぐらいまあ文章はそれっぽいいい感じ英語っぽい 文字の並びとかになってるなっていうのは同じなんだけども出てくる文文字が違うねっていう風になってたりしましたね まああの明らかに僕はコードを変えているので このコードが実際の結果と違うあの彼のビデオと違うのはまあ当たり前なんだけどもそうじゃなくてもなんか途中からちょっと答えがずれてきたんでなんか 僕の方で別なところで彼のソースコードと微妙に違うところとかが発生したのかもしれないですけども 面白いんで皆さんも版書ね昔学校で先生が黒板に書いてるやつみんなノートに書くでしょうと そのノリでねアンドレ先生がビデオのスクリーン出してるやつを生徒は 自分のターミナルでタイプするって言うのはいいよね なんかセミナーに行ってハンドアウトくれって言ってスライドが印刷された紙だけもらっても安心して何も考えずに参加した参加しただけで 帰っちゃう人とかいるけどね何の足しにもならないよね なんかねなんかあれだね皮肉ってばっかりだねやめましょうはいっ っていうのがえっと これがアンドレのビデオの一番最後の結果なんですねキャラクターベースの8 gpt を実装してシェイクスピアのデータセットで学習して こういう感じに英語っぽい文字が出せるところまで来たとすごいすごいと さてこっからあの拡張していこう 僕の音完璧にわかったを実際に確認するプロセスビデオの中で言ってたんだけども 僕に知らなかったんだけど今までオープン ai が オークナイザーリリースしていると ギットハブにオープン ai キックトークンクトークンアジャレは世界共通なんだね多分おじさんの 共通っていうのかなピックトックから来てんだよねセンスをたがりますがえっとねあの gpt 2の時代で導入されたのかな使われたっていうのかな あのサブワード レベルのトークナイザーでbpe っていうアルゴリズムを使っているやつ もう一個有名なのグーグルのセンテンスピースってのありますねが今も gpt が席巻しちゃってるんで オープン ai のトークナイザーを使うっていうのはマジョリティに従うっていう感じなのかな 今回思いましたがこれあのアンドレイのビデオでちょこっと 紹介されてたんでどんなもんかと思って使えるのかなと思って今のキャラクターバージョンの gpt をまずピックトークンバージョンに書き換えてみましたで 書き換えたものの結果だけお見せしますがキャラクターベースだとあれねえっとボキャブラリーのサイズが アルファベット24の倍プラス記号ぐらいで収まる60いくつしかバリエーションがないんですがサブワードワード をもうちょっと細くしてるけれどもそういうトークナイザーだとボキャブラリーの数が 下手違いになりますね具体的にはボキャブラリーが 5万バーサス60とかだからね10の3桁違う 世界が違うんで8パラメータね実際に実行させる時のパラメータを調整しないと動かなかったメモリー エラーになっちゃったんで若干調整したよっていうのをここも書いてあるわけですけども4的にトークナイザーの設定はさっきのキャラクターベースからここをここに変えたように とはいってもインポートしてねキックトークンで設定しといてエンコードとでコードっていうメソッドがキャラクターベースの方で作ら れてたんだけどもそれドロップインできるようにエイドティックトークンでエンコーダーとでコーダー実装 しただけですもうこれだけ でえっと名前をねモデルのネームをさっきのバイグラムからタイに gpt てあのわかりやすく書いただけですけど中身を同じものにして8学習してデータセットはシェイクスピアそのままを使ってます で学習させたらロスの値自体がもちろんねあのトークナイゼーションだからベクトルの ロパティとかあの方形挙動とか全然違うから値は違ってくるんだけども まあこれなんか挙動が怪しいね最初にどーんと4点いくつまで落ちているんだけども 後半6までもを戻っちゃったりしてますがでこれ結果ね 結果はあのシェイクスピアって えっと舞台劇ですから人物名セリフ人物名セリフっていうテキストが主なんですけどもその形式がきちんと 出ているのでさっきのねキャラクターベースよりもずっとレベルが高いんではないかなという気がしますってことでまず トークナイザーをキャラクターベースからメジャーどころのティックトークンにアップグレードしたと でこれのメリットっていうか狙いの一つはねキャラクターへとティックトークン はワードベースのやつで 当然 gpt で使われてたっていうことが意味する通りで言語マルチ言語に対応してるのボキャブラリーは全部カバーされてるはずだって調べて ないですけどね当然そうじゃないと行くわけないと思ってもう暗黙のうちに思ってるけども 言い換えれば日本語がそのまま8トークナイズできると キャラクターベースでやろうと思ったらねアルファベットも もちろんあのボキャブラリーを一時設定し直しはいいだけの話ですけどね8でもティックトークン使えば gpt と同じトークナイゼーションで日本語も普通に通るだろういう腹があったのでこれを使ったああああああその前にいろいろ実験だ えどねちょうどニュースでね facebook がパラメータフリーの8オプティマイザーを平安しててっていうのを ak さんのツイートであこういうのあるんだと思ってこういう楽チンやなぁと思ってで特に アンドレーのあのこの学習ルーチンループってラーニングレートはもう目の子で めてやってるって感じだよねラーニングレートファインダーとか実装もちろんめんどくさいかったるいからそのほうでやりたくないよねっていうのはわかるんで だろうこれそのままさあこのこの自動でパラメーターチューニングしてくれる8オプティマイザー 使ったらいいやと思って実験してみました論文はこれなんですけど論文やいいきちんと読んでません なんかうまいことしてくれるんでしょでね facebook リサーチのギットハブのレポジトリにも行動があってもうピップにも 登録されているのでピップ一発でインストールができるというので ピップ一発でインストールして使ってみましたオプティマイザーねで使い方によると 8ラーニングレートっていうのは1デフォルト1を与えとけばいいとこれはだからスケールファクターなんで あの1を与えなさいとんでそれを10倍にしたかったら10にするし自分の1したかったら0.1にするとか 論文ちゃんと読んでるんで僕がこれ買ってないけども1ってやっとけばデフォルトで合わせてくれるっていう話だと思います でやってみましたしたら最終的な値5000ループエポック回してるんですけどエポックじゃないなステップも 貼らしてるんですけども5.96 でさっきの8アダムを使ったループだといったん4.8まで落ちてるんだけども最終的に何グッと 上がって6.2とかその前を5.9とか本当はねこの4.いくつになってほしかったんだけど これ繰り返しやって多分それでもそこよりも下がらなかったんでもういいかと思って検証はここで中断しましたが 少なくとも何らかの学習はしてるとラーニングレート1にしてループを回しただけで でえっとその状態で文字を生成しろって言ったら まあどっちが優劣をつけられるかって言うとよくわかんないですけどもそれっぽい出力はさっきのと同じぐらいのそれっぽい出力は出ていると なのでd アダプテーション すげーかーっていうとよくわかんないという感じですね オプティマイザーに関してはえっとこれも最近なんかgoogle だっけ ランゲージモデルかえっとそれこそチャット gpt みたいなものにアルゴリズムを提案させて実装したら8いいのが出てきたみたいなのなんかちらっと twitter で見かけたような気がしますねそれも試してみたいというのもまだ試しててかそれ自体まだきちんとあの確認できてないんで それも後でやってみたいかなとはい横道にそれましたがね tiktok に使った理由は日本語が通るようになるよねっていうことで日本語を通したい日本語データセットといえば 全系 i フォーラムでも nlp 特集の時に何か使った青空文庫でダウンロードしてきたものがありますね僕も多分その時だと思うんだけど聞いたんねえっとユニコードのなんかごちゃごちゃっとしたチップスを投稿しましたけども でその時に多分作ったデータセットはねえっとコンピュータに転がってたんでそれを読み込んでそれで学習させてみようと思いました で青空文庫でメジャーどころっていうかね名前よく知ってて作品数が多い作家さんを数えた14人ぐらい 手元のハードディスクの中にドキュメントあったんでそいつを全部連結させて 1個のテキストファイルだからもう作家問わずに青空文庫の小説の 特テキストっていうのデータセットにしてタイニー gpt を学習させてみましたと イックトークンでトークナイズしたい パラメータはさっきのえっとシェイクスピアをティックトークンで使ったのと同じでデータセットはさっきのえっと青空文庫のデータセット使ったサイズはこれぐらいと えっとシェイクスピアよりも多分サイズはでかいんじゃないかなと思いますで学習させてみたと 結構これはあの繰り返し繰り返し繰り返し結果学習させたあとの結構後半の方ですけどもサンプルね我が輩はの続きをかけ創跡は入ってるんだけどね ソースに入ってだよね創跡一番最初に入ってるね ドアがはいは夢に気が済ませなくなっているのです なんとかかんとかねもっと学習したらもっと良くなるかなと思ってちょっと ループをさらにループするようなプログラムにして一晩とか回してたらもう結構頭打ちでえっと最終的に一番良かったのはこの辺で さっきの奴が2.28とかなってますけども2.18ぐらいまで下がったんですけどもその時のサンプルは 我が輩はなんとかがんとかいいのか悪いのかわかんない でも日本明らかにね日本語っぽいそれっぽいフレーズは出るっていうことは 確認できたという話ね