GPUのスペックはこのへんの比較サイトにモデル名を入れると比較できるが、たぶんA100>V100>A10G>T4>M60という感じか。TopCPU.netビデオカードを比較する気になるのが、バッチサイズに直接影響するGPUメモリの容量で、とくにTransformerはとてもメモリを食う。Colabで小型Transformerに英日翻訳を学習させたとき、メモリ40GBのA100*1を使ってたのだが、これでも少ないと感じてしまった。ところで、Colabでメモリ40GBのA100が使えることを考えると、いくら長時間稼働に関してAWSが有利だとはいっても、あまりスペックを落として使うぐらいならColabで高速に済ませてしまったほうがいいような気はしてくる。AWSではGPUが複数登載されたものがあり、並列化することでさらに速くできるので、安いやつを並列で使うと総合的にみてColabよりお得だったりするかもしれない。A100が使えるP4インスタンスは現状「p4d.24xlarge」しか選択肢がなく(リージョンによるらしいが)、これはA100が8個もついてて、1時間45ドルもする。これは気軽には使えないが、もう少しスペックの低いインスタンスで複数GPUの並列処理のコードを試してから、本気の処理をするときだけこのインスタンスに乗せてもいいのかもしれない。V100が使えるP3インスタンスは、1個、4個、8個のものがあり、8個つきの「p3dn.24xlarge」は1時間43ドルもするが、1個だけの「p3.2xlarge」だと4ドル、4個つきの「p3.8xlarge」だと17ドルとなる。A10Gが使えるG5インスタンスは、8個つきの「g5.48xlarge」が1時間24ドルで、4個つきの「g5.24xlarge」が12ドル、1個つきの「g5.16xlarge」だと6ドルに成る。T4が使えるG4インスタンスは、1個つきのうち一番安い「g4ad.xlarge」が1時間0.5ドルで、4個つきの「g4ad.16xlarge」や「g4dn.12xlarge」が5ドル、8個つきの「g4dn.metal」が11ドルになっている。これらを総合的に考えて、とりあえず、T4を4個つけた「g4dn.12xlarge」で複数GPUを並列で回すのを試してみて、うまく回りそうだったら最強スペックの「p4d.24xlarge」に移植してみようかなと思った。*1:A100には80GBの製品もあり、AWSではこれが使えるのかもしれない。読者になるもっと読むコメントを書く2023-08-31小型のTransformerに英日翻訳をイチから学習させてみた翻訳機を自作してみたChatGPTやDeepLの元になったTransformer*1をつかって、英語から日本語への翻訳を学習させてみました。現段階で、いくつかの英文を翻訳させてみた結果が以下のとおりです(青字が機械翻訳)。life.時間は限られているので、他人の人生を浪費しないでください。(拙訳:君たちの時間は限られている。他人の人生を生きるようなことをしてそれを無駄にするな。character.私は4人の小さな子供たちが、いつか、自分の肌の色ではなく、その性格の特徴によって判断されない国家に住む夢を持っています。(拙訳:私には夢がある。私の4人の子供たちがいつの日か、肌の色ではなく彼らの人格によって判断される国に暮らせるようになるという夢が。one.夢想家だって言うかもしれないけど、私だけじゃない。いつか、ぼくらと合流してくれるといいんだけど。世界は、ひとつのものになる。(拙訳:夢想家だと君は言うかもしれないけれど、僕は一人じゃない。いつか君も一緒になれれば。reason.狂人は理性を失った人間ではない。狂人は、理性以外はすべてを失った男だ。(安西徹雄訳:狂人とは理性を失った人のことではない。狂人とは、理性以外のあらゆる物を失った人のことである。Plato.ヨーロッパ哲学伝統の最も安全な一般的な特徴は、それがプラトンへの一連の脚注から構成されていることです。(拙訳:ヨーロッパ哲学の伝統について間違いなく言えるのは、その全てが、プラトン哲学へのひと続きの注釈に過ぎないということである。creative.暴力は時々すぐに妨害を片付けるかもしれませんが、それは創造的に証明されたことはありません。(拙訳:暴力が、問題を手っ取り早く片付けるのに役立つことはある。暴力それ自身が創造的であったことは一度もない。/アインシュタイン)表現がこなれてなかったり正しく訳せてなかったりするのですが、ひと昔前のGoogle翻訳ぐらいの性能は出ている気がしますね。個人で、小規模なコーパスを半日ぐらい学習させただけでも、これぐらい訳せるのだから、やはりTransformerは偉大ですね。ちなみに、手元のモデル自体もまだ改善の余地があり、コーパスも大きくしようと思えばできます。学習の概要どういう学習をやったか簡単にメモしておくと、以下のような感じです。学習データについては、無償配布されている英日対訳のコーパスを何種類か集めて、クリーニングした上で統合したものを使いました(先日のエントリで手順を説明)。対訳文の数は、トータルで約128万ペアです。Need論文は各6層)。Need論文は2048)。Need論文の構成だと約1.1億個になる)。PyTorchのTransformerクラスを使っており、コードもPyTorchのチュートリアルに従いつつ、何点か修正を加えて動かしています。Colab上で、A100というGPUのランタイムを使って学習させました。検証誤差はまだ低下中なので、まだ学習を進める余地があるのですが、とりあえず30エポックまで学習させて16時間ぐらいかかりました。コードを書く上で、基本的にはPyTorchの以下のチュートリアルを参考にしましたが、次に述べるような変更を行っています。documentationコーパスは別のところから取ってきて、独自に整理したものを使った。Encodingを行って作成した。変数名がわかりにくかったり、記述の順番がわかりにくかったところは、適宜整理した(特にトークナイザ周辺)。学習時に勾配累積を行えるようにした。学習済みのモデルをロードして推論や追加学習を行うために、色々保存しておかないといけないものがあるので、整理して保存する部分を追加した。貪欲法だけでなくビームサーチでの推論もやってみた。改善の余地がありまして、具体的には以下のようなことが考えられます。30エポックで止めてますが、まだ検証誤差は減少中だったので、学習を継続すればもう少し精度が上がるかと思います。(⇒大して上がりませんでしたw)コーパスは、全体としては3000万ぐらいのペアがある中から選別して128万件を抽出しているので、拡大することはできます。2500万と最大のデータ量をもつJParaCrawlというコーパスが、よくみると品質がいまいちなので、単純に全部使えばいいわけではなく精査が必要ですが*3、数百万ぐらいの規模にはできる気がします。モデルをもっと大規模にする(トランスフォーマーブロックのスタックを増やす、フィードフォワード部分や埋め込みの次元数を増やす等)こともできます。Need論文のBase構成ぐらいまでは大きくしてもいいのかも知れない。単なる規模以外に、各種ハイパーパラメータの組み合わせも色々試して比較したわけではないので、工夫の余地があるかもです。ビームサーチの精度が低いので、何か間違えてるかも知れません。冒頭で紹介した翻訳結果の例はすべて、貪欲法でやったものです。ビームサーチすると、近い内容ではあるものの、最後に。繰り返されたりして変になります。大変そうなので今のところやる予定はないものの、たとえば日本語と英語のWikipediaをそれぞれLLMとして事前学習させた上で、ファインチューニングで翻訳を学習させると、精度は上がるんじゃないでしょうか。Wikipediaだったらデータを手に入れるのが簡単だし。Faceにある事前学習済みモデルを使えばいいかも知れません。翻訳の性能とは関係ないが、学習速度を早めるために、シーケンスをパディングするのをやめたほうがいいかもしれない。(今はバッチ内で最長のシーケンスに合わせてパディングしているので、バッチ内に長文が混ざると一気にテンソルがでかくなってメモリを圧迫している。)学習に使ったコード以下にコードを掲載しておきます。モジュールをどこで使うのかがわかりやすいように、一番上にまとめてではなくセクションごとにインポートしてます。セクション名の後に(☆)がついているのは、学習済みモデルを読み込んで推論を行う際に改めて実行する部分です。途中まで学習したモデルを読み込んで追加学習するときも、だいたい同じですが、当然学習に係る部分に要否は異なります。直しながら書いていったコードそのまんまなので、あまり整理されておらず、もっとラップしたりして見やすくしたほうがいいとは思います。/content/save_tempディレクトリの決定、パスの設定(☆)これは完全に私の個人的な都合で設定しているものなので、どうでもいいっちゃどうでもいい。コーパスとかモデルごとに「プロジェクト」としてまとめようと思ったので、そういうディレクトリ構成になっています。学習済みもしくは途中まで学習したモデルを読み込んで、追加学習を行ったり推論を行ったりすることがあるわけですが、そのためには関連ファイルをきちんとロードする必要があって、最初は適当にやってたので何度かミスりました。それを避けるために、やや細かくディレクトリを整理しました。"\n")コーパスの事前処理これもどういうコーパスを使うかによってかわりますが、私は先日のエントリで作成したような、「日本語と英語で1ファイルずつになっていて、行ごとに対訳として対応している」というコーパスファイルを作ってあったので、それを使う前提になっています。Need論文にあわせて各言語共通の語彙空間をつくるようにしたので、英語と日本語を(SentencePieceの学習のためだけに)連結したものも作りました。パディング記号を定義して語彙空間にセットするです。SentencePieceの学習にはけっこう時間がかかる(今回のデータ量で数十分)ので、1回構築したら、Transformerの学習中/済みモデルを読み込んで追加学習や推論を行う際は、SentencePieceのモデルも単に読み込むだけにしたほうがいいです。チュートリアルの変数名は意味不明だったので変更しています。それ以外にもいろいろいじった気がする。'/vocab_ja.pth')トークナイザのロード(☆)これは、学習中/済みモデルをロードして、学習を再開したり推論を行ったりする場合に使用する部分です。最初の学習時は実行しません(しても問題ないけど)。'/vocab_ja.pth')テキスト→テンソル変換器(☆)テキストを、モデルに入れられる形のテンソルに変換するための部品です。チュートリアルではもっと下のほうに書いてあったのですが、分かりにくいので上にもってきています。中身を一応確認する場合text_to_tensor['en']('apple')Transformerモデルの設計(☆)ここがモデルのコア部分です。その後、Trueの要素を-infに、Falseの要素を0.0に置き換える。tgt_padding_maskモデルのアーキテクチャ(Transformerのハイパーパラメータ)の設定ここでアークテクチャと言っているのは、Transformerのモデルの各パーツのサイズみたいな感じです。あとで呼び出すことがあるので、PyTorchのオブジェクトとして保存してます。'/model_arch.pth')学習の準備Transformerモデルのアーキテクチャを設定してインスタンスを作成したり、オプティマイザのインスタンスを作成したりしています。学習率のスケジューリングを書くのが面倒だったので、固定にしてますが、エポックの進展にあわせて小さくしていくようにしたほうがいいとは思います。epsはゼロで割るのを回避するための部品データローダのセット学習時に、コーパスの中からデータを取って、バッチにまとめてモデルに供給していく装置です。collate_fn=collate_fn)学習ルーチン学習と検証のルーチンです。勾配累積を使うようにチュートリアルから変更してます。train_dataloader)の部分でローダからデータがモデルに供給されて、勾配が計算されたりパラメータが更新されたりしていきます。検証ロスがベストを更新したら、モデルを保存するようにしています。Driveとの接続がおかしくなることがあるので、Colabサーバ側でもモデルを保存するようにしています。これは緊急時にここからモデルを救うというものなので、別に保存してなくてもいいといえばいいです。あと、ログを書き込むようにしてます。保存したモデルのロード(☆)ここは、追加学習や推論時に何が必要かをちゃんと理解して、整理しておく必要があります。別にどうでもいいと言えばどうでもいいですが、モデルのパラメータ数やデータのトークン数をカウントしたいとき用。len(corpus_en))推論の関数(貪欲法)推論を実施するための関数です。"")推論(翻訳)の実施いよいよ翻訳をやってみます。以下の例文はコーパスに含まれていないことを確認済み。need”という論文で提案され、自然言語処理の性能を革命的に向上させた。*2:いわゆるLLMの事前学習を行うためのチュートリアルもあって、こちらでは、エンコーダ側とデコーダ側が分かれたクラスが使われてる。documentation*3:以下のブログ記事ではJParaCrawlを全部使って学習した例が紹介されているが、大して性能がよくはなっていない模様。Colabでニューラルネットの学習中に、いかに処理を中断させないかで悩むことは多いと思います。ググるとよく紹介されているのは、12時間や24時間でランタイムがリセットされてしまう問題:これはどうしようもないので、それまでにモデルや設定を保存しておいて、新たに立ち上げたランタイムで学習を継続する。90分間操作がないとリセットされてしまう問題:シェルスクリプトやブラウザのエクステンションを使って、定期的にページをリロードする。ところで私が悩んでいるのは、「パソコンを閉じてネット回線も切った状態で何処かに移動する」時にどうすればいいかという問題です。ふつうに考えたら、90分以内なら実行中のランタイムにもう一度接続できてほしいところなのですが、少なくとも自分の環境(MacのChrome)では、妙な現象が起きます。何も実行してない状況なら、再接続することで普通に続きから使えるのですが、学習の実行中とかに切ってしまうとおかしくなります。右上に「実行中」と表示され、実際にプログラムが動いているにも拘らず、右のほうに「ランタイムに接続していません」と出る。Driveのアイコンが未使用状態になっているのに、接続されているディレクトリが表示されており、実際ここにファイルを移したりできる。いう変な状態になります。右上のメニューから「ホストされているランタイムに接続」を押すと、下の画像のように、左下に「ランタイムに接続できません」という表示がでて、エラーになります。一応、プログラムは動いている様子で、学習も継続されているのですが(新しくログが出たりするので)、私が確認した範囲だと、学習済みモデルを保存するときにエラーが起きるようです。私の場合、以下のようなエラーが出ます。Driveのマウントが解除されてしまっていて、保存先が見つからないということだと思ます。Driveをもう一度マウントすればいいような気がするのですが、操作するとマウント自体はでき(ているように見え)るのですが、なぜか同じエラーが出続けてやはり保存はできません(でも後述の、colabサーバかファイルを移す操作はできます)。Colab側のサーバに保存します。以下はルートに保存した例。Driveに移すことが出来ます。下記の画像のように、実行の中断を受けつけてくれない場合があります。これは根気よく待てば中断できたりもしますし、私の経験では、中断のボタンを押してからブラウザをリロードすると、ランタイムの状態を保ったまま処理を中断してくれます。この処理の中断ができない場合は、保存の操作ができないので、ランタイムを再起動するしかなく、こうなるとどうしようもありません。いう場合を見越して、最初からモデルをColab側のサーバにも保存しておくのが安全なのかも知れません。実行中のプログラムを停止できなくても、ファイルを移す操作はできたような気がします。Driveの再マウントができるかどうか等で、いろいろ事象のパターンがかわりそうなのですが、厳密に検証はしてないので、理解が微妙に間違ってるかもしれません。Driveに移すという操作で救える場合がある、ということです。読者になるもっと読むコメントを書く2023-08-27無償配布の日本語・英語対訳コーパスのデータを綺麗にする★めぼしいコーパスをまとめてダウンロードしてクリーニングして統合するPythonのコードを最後にのせてます。★少しソースを増やして、最終的には後日のエントリに書いてあるようなコーパス構成にしました。日英対訳の(なるべく)綺麗なデータを得たいTransformerで機械翻訳をやろうと思ったのですが、てっとり早く試すだけの場合、綺麗な演習用データが配布されてる「英語-ドイツ語」や「英語-フランス語」のデータセットを使う人が多いんじゃないでしょうか。日本語」の機械翻訳を実践したいと思いました。品質がよくて分量が十分で無償配布されているという条件をみたす対訳コーパスが、都合よくあるわけではないということです。下記のページにいろいろまとまってるのですが、少なくとも私が確認した無償のものに関しては、どれも一長一短という感じで、「これさえ使っておけば」というものがない。日本語対訳データたとえば、NTTの研究所がつくったJParaCrawlってのは2500万件ぐらいあって数としてはすごいのですが、後述のとおり、中身をみると品質にかなり問題があると思いました。ソフトウェアのマニュアルの対訳なんかは、訳文は正確なんだろうけど、「それ学習してどうすんの」という部分が多い。法律や公文書の対訳データは、内容が偏っててそれだけでは多様性が足りない。これは京都Wikiなんかにも言える。その他、品質はいいけど一文が短かったり、内容的には申し分ないけど件数が10万件そこそこしかなかったりもする。そこで、いくつかのめぼしいコーパスのデータをクリーニングして、使いやすいデータを抽出し、統合して一つの対訳コーパスとして使うことにしました。本エントリの次のセクションでは、私が確認した各コーパスの内容と処理方針について簡単にメモしておきます。最後のセクションで、ダウンロードから前処理までまとめて実行するコードを載せておきます。ちなみに私は、使いにくいものは避けて、最終的に以下のものを採用し、合計約128万件の対訳コーパスを作成しました。augmentationを含めた処理後11万8825件)京都Wiki(元データは44万3849件/処理後21万8038件)映画字幕(元は280万1388件/処理後31万3927件)田中コーパス(元データは14万7918件/私は全部使用)法令対訳コーパス(元データは26万2449件/処理後18万5607件)JparaCrawl(元データは2574万0835件/私は20万件を使用)(これを全部合わせると134万2843件で、そこから全体をみて英文400文字、日本語文200文字以内のものに限った結果、128万0621件になった。これは、学習時にミニバッチ内で最長の文に合わせて他の文をパディングする処理をしており、長文が1つでも含まれるとバッチがデカくなりすぎてメモリを圧迫し、そのせいで全体としてバッチサイズを大きくできなくなってしまうため。)にわかTransformererなので肌感覚がないんですが、この程度の規模だとTransformerの強みが活かされず、LSTMとかのほうがいいのかも?ただし上記件数は、文が長すぎたり短すぎたりするものを削ったり、一部のデータセットに偏らないように件数を絞って使うことにした結果なので、たとえば映画字幕とJParaCrawlからのサンプルを増やしたりすれば100万単位のコーパスも作れると言えば作れます。各コーパスについて、詳細は後述しますが、それぞれの大まかな印象は以下のような感じです。TED字幕:品質がとてもよく、口語調のサンプルが手に入るのもいい。青空文庫等の小説:データの加工が多少必要だが、文章の品質がいい。後述の処理によって比較的長文のサンプルが手に入ってよかった。京都Wiki:訳文はしっかりしてて件数も多いが、内容が偏り過ぎ。映画字幕:件数が膨大だが、1つ1つが短く、意訳も多いという癖がある。田中コーパス:品質がいいだけに、14万件しかないのが惜しい。法令対訳コーパス:内容が偏るが、品質はとてもいい。あと「長文」サンプルが稼げる。JparaCrawl:件数が2500万と大きいが、品質はいまいち。できあがった統合コーパスの品質についてですが、ランダムに20件抽出したのものが以下のとおりで、変なのも混じってますがまぁ良いんじゃないでしょうか。ネルソン・マンデラは、アパルトヘイトの暗黒の日々の後、法の下の人種差別という灰の中から、南アフリカ共和国を引き上げました。彼は性的指向による差別を、憲法内で禁ずる世界初の国へと、南アフリカ共和国を導いたのです。constitution.大海人皇子が挙兵のため吉野から東国に出立したときに、皇子に従った二十数人の男の一人であった。army.二つの情熱を組み合わせたんですね。passions.この事故は、カメラが、一部始終、記録していました。camera.そこへ行っていただけませんか。there?それをやってみるなんて狂気に近い。it.彼女からの手紙が郵便受けにはいっていた。mailbox.明治維新後はこうした規定は廃止され、各宗派それぞれの規定に基づいて(大抵は得度時に)度牒を交付する事になっている。stipulations.全列車JR西日本223系電車1000番台及びJR西日本223系電車2000番台電車使用で、8両または12両編成で運転。technologiesこれは大変なことです。マウス細胞だけでなく、ヒトの皮膚細胞から、ヒト幹細胞を作れるからです。dragon礫の一部を打撃して造るチョッパー・チョッピングツールを主体とする。pebble.(拍手)、そしてアップル愛好家がいるのもわかってますよ。aficionados.私はバスの中で財布を取られた。bus.私は暫く待つように言われた。while.胆のうの手術でしたら、この廊下をずっと行って右に曲がってください。right.彼女の住所を教えてくれませんか。address?少なくとも、どれか1つのコーパスを単独で使うよりは遥かにいいと感じられるので、満足してます。長いものから短いものまで、書き言葉から話し言葉まで、多様性もあるし(といっても長い例文は不足してますが)。無償コーパスの中身を自分で精査してみた人でないと実感が湧かないとは思うのですが、とにかく私は、JParaCrawlの品質に絶望したあとなので、これをみるとオアシスのように感じられますwちなみにここから5万件ぐらいだけ抽出してTransformerにかけてみたら、小規模でも思ったよりそれらしい出力が出ました。全データ使った学習は後でやります。(MTTT)TEDトークの字幕のデータで、口語調なのだが、かなり整っていて品質は高いと思える。あと、短いセリフはいくつかまとめて1行になっている点もよい。対訳コーパスは1文が短すぎるものが多く、文脈を考慮して意味を読み取れるTransformerの力が発揮できない気がするので。日本語文をみると、以下のような感じで、句読点がなく半角スペース区切りになっている。パニックになる人もいますけどね\n適当に読点や句点を入れる必要があるんですが、文末は句点だとしても、文中のすべてを読点にすればいいわけではないのが難しいところ。」等の場合は句点を入れる。文中でそれ以外は読点を入れる。いう変換をやってみたところ、全体的にかなりいい感じになった。プロジェクト、グーテンベルク・プロジェクトなど、小説のオープンなデータのうち、日英の対訳が揃っているもののデータらしい。日本語分はChasenで分かち書きされていて、単語間にスペースが入っているのだが、これはTransformerで解釈する上では不要なので後で消す。文献情報や注釈など、翻訳の学習によくなさそうなデータも混じっているのだが、流石に小説として読めるテキストだけあって、文章は綺麗である。小説なので当然「意訳」されているところもあってそれがネックな感じはした。あとなぜか、1文1行になっていないところがけっこうあり、ひと続きの文なのに2行に分かれてたりする。1文1行になっていても、それが理想的なわけではなく、前後の文脈がないと意味が取れない文もある。そこで、以下のようにクリーニングした。日本語なのに英数字がたくさん入っている文を削除(注釈とかなので)。英文が大文字で始まっていないところは、前の文と続けるようにした。文脈の連続性を多少でも考慮できるように、全体的に2文ずつセットで1文にしてまとめた(なのでサンプルサイズが半分になる)。強引な処理だが、これによって「長文」のサンプルが稼げるメリットもあるように思った。さきほど言ったように、対訳コーパスは短すぎるものが多いので。あとで思いついたのだが、ペアにする組み合わせをずらすことで別の文をつくることができる。augmentationになる。そこでずらしたバージョンを追加し、さらに2文連結する前の短い文も残すことして、結果的に11万件ぐらいのコーパスになった。京都Wiki京都フリー翻訳タスク京都に関連するWikipediaの情報を集めて英訳したものらしい。翻訳はしっかりしている印象なのだが、仏教や歴史の説明が多くて話題が偏っているので、このコーパスだけ学習してもあまり意味がない気がする。あと、たとえば以下のようなリスト的な情報もあり、これ訳してどうすんのと思ってしまう。(山崎正一全訳注.講談社学術文庫,2003年)訳文はたぶん綺麗なほうで件数も多いのだが、内容が偏っているという感じなので、全件は使わず、短すぎる文と長すぎる文を除いて絞ることとした。(長いほうは除きたい理由が具体的にあるわけではないのだが、どのコーパスにも言えることとして、めちゃめちゃ長い行はなんかよくわからん情報が入っていることが多い。Wikipediaだし。)映画の字幕JESC映画の字幕の対訳データで、件数がすごく多い(280万件)のと、データのフォーマットが綺麗で使いやすいところがメリットだと思う。日本語で句読点が付いてない文が多く、文と文の切れ目が半角スペースで区切られている。これをどう処理するか、真面目に考えると難しいのだが、面倒なのでとりあえず全部読点で置き換えることにした。想像すれば分かると思うが、映画の字幕なのでかなり意訳が混じっており、日本語と英語が素直に対応していない部分も多い。あと、これも字幕だから当然なのだが、全体的に文が短い。元の件数が非常に多いので、文の長さが一定以上の長さのものだけ抽出。Wikiどういう由来のものかよく調べてないのだが、自分が見た中では、かなり品質のいい対訳データだと感じた。文章が整っていて、翻訳も正確。残念ながら1文1文が短くて、語学の教材の典型的な例文という感じ。フォーマットの整理だけして、全て使うことにした。JParaCrawlJParaCrawlこれが最もくせものだと思う。ウェブからクロールしてきたデータで、件数が2500万件もあるので、内容の多様さと規模が魅力だから、そこだけ聞くと使いたくなる。コーパス作成手順としては、日本語と英語が半々に近い分量含まれているサイトをまず集めて、そこから内容的に対応してそうな日本文・英文のペアを自動で抽出しているらしい。ところが中身をみてみると、割と品質が低いと言わざるを得ない感じ。そもそも「できの悪い機械翻訳」みたいな訳文がたくさん含まれているし、意味的に全然対応していないペアも含まれている。明確な説明はみつからなかったのだが、どうやら対訳としての品質(意味の類似度?)のようなスコアがすべてのペアについている。群馬]という商品名みたいなやつが大量に並んでいる部分もあって、なかなか難しい。スコア0.5から0.8までを0.5刻みで階級化し、各階級から30の例文をランダムに取って、ChatGPTに与えて「適切な訳ならgood、不適切ならbad」と評価するよう頼んでみたところ(横着な作業だが...)、やっぱり高スコアのほうがgoodは多かった。そこで、0.7以上のデータを使うことにして、長すぎるものと短すぎるものを削ったり、日本文に英字が含まれているものを削ったり、英語が大文字で始まってないもの、日本語が。おわっていないもの等を削除してある程度クリーニングし、そこから20万件だけを選んで使うことにした。ダウンロード、整理統合のPythonコード以下に、ファイルのダウンロード、クリーニング、件数絞り、ファイル統合などの前処理をまとめたコードを置いておきます。スマートな書き方は追求してなくて、記述が冗長になってるし、部分的に変数名が重複してたりもするかも知れません。上から順に実行する分にはとりあえず問題ないです。Colab上でまとめて動かしてみたら、TEDとJParaCrawlのダウンロードに時間がかかるものの、他の処理は一瞬でした。冒頭で作業ディレクトリのパスを指定するだけで、あとはまとめて実行でOKです。最終的に、日本語と英語のそれぞれのファイルができますが、行ごとに訳文として対応しています。コーパス順とかに並んでるのではなく、シャッフルしてます(学習で使うときにどうせシャッフルするため)。京都、映画字幕は一定の字数範囲に収まるサンプルに限る処理でけっこう件数が減っているし、JParaCrawlはクリーニング後には367万件ほど残っていたのを20万件だけサンプルしているので、増やしたい場合はこのあたりで調整できると思います。全体の量も増やしたいところではありますが、最も改善が必要なのは「長文」のサンプルが足りない点。これは、法令の対訳データが長文なので使うと良いかもしれない(以下のリンクは憲法の例)。まとめて抜く方法が分からなかったので今回は採用しなかったけど。Translation......と思ったら法令の対訳をまとめたコーパスがあったので使うことにしました。全件で26万2449件あり、短い文を除いて使うことにしました。Driveをマウントして使ってる時は、パスは以下のようになる。本データセットは\n付いたまま処理する。句読点の挿入'''日本語が以下のような感じで、句読点がなく半角スペース区切りになっている。2文中でそれ以外は読点を入れる。3文末は句点を入れる。これでだいぶきれいになる。