初学者の統計学習ノート統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。GitHubWikipediaから作られた多言語の対訳データで、英語と日本語の組み合わせをみると85万1000件ある。これは中身も少し整理してみたが、結構品質は高い。明らかに変なデータも混じっていたり、日本語と英語が対応していないものもあったりするが、全体としては綺麗だと思う。公式のGitHubによると、両言語の意味の一致度を機械的に判定したスコアがついてて、多くの言語において1.04ぐらいがバランスがいい(一致度とサンプルの多様性を考慮して)と書いてあった。私は、1.45にしてから、日本語と英語の文字量の比率が極端なものや、日本文が句点で終わらないもの、英文が大文字で始まらないものを除いて、40数万件を使おうかなと思う。LABスタンフォード大がつくっている、自然言語処理による論理的な推論のベンチマークに使われるデータを日本語に機械翻訳したものらしいので、野生の対訳データではない。機械翻訳した後、BLEUスコアの閾値でフィルタリングしたデータが533,005件あって、これで自然言語タスクをやらせたら90%以上の性能があったと書いてある。人力で訳を確認したものもあるがそれは数千件(devデータとして作られている)。こっちは、本家SNLIのデータとこのJSNLIのデータを紐付ける作業からやらないといけなくて、加工がけっこうたいへんそうな気がする。先日のエントリで私が構築した、7つのコーパスを組み合わせた混合コーパスは、色々処理して絞り込んだ結果128万件ぐらいなんですが、もし上記2つのコーパスが品質的に「全て使って大丈夫」そうだったら、これらを追加することで200万件規模になることになり、翻訳の精度がさらに上がりそうなので、あとで試そうと思います。読者になるもっと読むコメントを書く2023-09-10DataParallelでの複数GPUの並列化が上手くいかない(PyTorch)単なる作業経過のメモです。AWSで、gクラスのインスタンスのvCPU数上限緩和を申請したら通りまして、複数GPUのインスタンスが使えるようになりました。そこでGPU4枚のインスタンスを立てて、以下のような情報を参考に、先日構築したTransformer翻訳機にとりあえずDataParallelのほうを適用してみたのですが、なかなかうまくいかず苦労しています。コニカミノルタ最初、一番苦労したのは、DataParallelがバッチを自動的に4分割する際に、マスクの形状が乱れることです。Transformerのマスクの制御は、本質的にそんなに難しいわけではないはずなのですが、いろいろミスが出てエラーに繋がります。Transformer本体の関数に対して外でつくったマスクを与えるのではなく、なるべく内部で生成するようにしたら、エラーは出なくなりました。ところが学習をさせてみると、どうも1エポック目の1バッチ目から、forward時にすべての出力(テンソルの中の値)がnanになってしまう問題が発生しており、とりあえずいま作業時間がないので中断して放置してます。したら、最初からDistributedDataParallelのほうを試したほうがいいのかもしれない。そっちのほうが、適用するために書く部分は多いんですが、PyTorch公式でもそっちがおすすめされていて、速度も速いらしい。【追記】DistributedDataParallelを使ったらうまく行きました。Lab等の対話環境から使うのには向いておらず、学習用のコードをスクリプト化して直接実行することが前提になるので、もともと対話環境でコードを書いていた場合はそれを再構成するのがめんどくさい......と感じたのですが、実際やってみたら大して面倒ではなかったし、動作も安定していて何よりです。読者になるもっと読むコメントを書く2023-09-03英日翻訳の混合コーパスとJParaCrawlで機械翻訳の品質を比べてみた※コーパスを「自作」したとは言えないのでタイトルから「自作」を取りました先日、小型Transformerで英→日の機械翻訳をやらせてみた(先日のエントリ)のですが、その際にコーパスは、いくつかの無償配布コーパスを処理して独自に再編成したもの(合計約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つでも含まれるとバッチがデカくなりすぎてメモリを圧迫し、そのせいで全体としてバッチサイズを大きくできなくなってしまうため。)先日の別のエントリで述べたように、JParaCrawlというのがくせ者で、ウェブから収集した2500万もの例文が収録されていて規模はデカいので魅力的なのですが、中身をみると品質にばらつきがかなりあります。質の低い機械翻訳で作られているサイトの対訳を引っ張ってきていたり、そもそも英文と日本文の意味が対応してなかったりもします(全く対応してないものもあれば、最初は対応してて途中から別の話になっているようなものもある)。私は件数は我慢して、上述のように128万件の混合コーパスのうち20万件だけをJParaCrawlにしてるのですが、これを全部、クリーニングなしのJParaCrawlにしたらどうなるのかを試してみました。今の環境だと2500万件で実行するのはつらいので、件数を揃えて、JParaCrawlの対訳コーパスからランダムに128万件を選んだらどうなるのかを試してみました(なのでこれがJparaCrawlの「本気の実力」ではない点に注意)。以下が、混合コーパスとJParaCrawlの訳の比較ですが、どちらにも誤訳が含まれていて、ジョブズ・トランプ・アインシュタインの例文についてはどっちもどっちですが、その他は混合コーパスのほうがいいと思えます。ポテンシャルから言えば、件数が多いことのメリットはあると思うので、JParaCrawlを根性でクリーニングしてまともな対訳だけを選んで、たとえばJPara400万件とその他100万件みたいな混合コーパスにしたりするのが理想的かもしれません。life.【混合】時間は限られているので、他人の人生を浪費しないでください。【JPara】あなたの時間は限られているので、他の誰かの人生を生きることを無駄にしないでください。(拙訳:君たちの時間は限られている。他人の人生を生きるようなことをしてそれを無駄にするな。character.【混合】私は4人の小さな子供たちが、いつか、自分の肌の色ではなく、その性格の特徴によって判断されない国家に住む夢を持っています。【JPara】私は4人の小さな子供が1日、彼らが彼らの肌の色によって判断されない国に住んでいることを夢見ていますが、彼らのキャラクターの内容によって。(拙訳:私には夢がある。私の4人の子供たちがいつの日か、肌の色ではなく彼らの人格によって判断される国に暮らせるようになるという夢が。one.【混合】夢想家だって言うかもしれないけど、私だけじゃない。いつか、ぼくらと合流してくれるといいんだけど。世界は、ひとつのものになる。【JPara】夢の話ですが、私は唯一のものではありません。(拙訳:夢想家だと君は言うかもしれないけれど、僕は一人じゃない。いつか君も一緒になれれば。reason.【混合】狂人は理性を失った人間ではない。狂人は、理性以外はすべてを失った男だ。【JPara】狂った人は彼の理由を失った男ではありません。(安西徹雄訳:狂人とは理性を失った人のことではない。狂人とは、理性以外のあらゆる物を失った人のことである。Plato.【混合】ヨーロッパ哲学伝統の最も安全な一般的な特徴は、それがプラトンへの一連の脚注から構成されていることです。【JPara】ヨーロッパ哲学の伝統の最も安全な特徴は、プラトへの一連の足ノートのシリーズからなることです。(拙訳:ヨーロッパ哲学の伝統について間違いなく言えるのは、その全てが、プラトン哲学へのひと続きの注釈に過ぎないということである。creative.【混合】暴力は時々すぐに妨害を片付けるかもしれませんが、それは創造的に証明されたことはありません。【JPara】暴力は時々すぐに閉塞をクリアしたかもしれませんが、それはそれ自体を証明したことはありません。(拙訳:暴力が、問題を手っ取り早く片付けるのに役立つことはある。暴力それ自身が創造的であったことは一度もない。/アインシュタイン)ちなみに下記のブログ記事では、JParaCrawlのデータを「全部」つかって学習させたようで、両側6層のTransformerなので私がやったやつより深いモデルですが、翻訳精度が思ったほど高いとは言えない。推論のサンプルが少ないのでわかりませんが、上記の私が使った「混合コーパス」による翻訳よりも、コーパス規模は20倍(しかもモデルの層の深さも2倍)なのに、精度は似たようなもんです。??になっているところは、コーパスの問題というより、トークナイザの未知語の処理方法の問題のような気がします。world!【混合】へえ、こんにちは、世界。today.【混合】今日は晴れだ。【JPara全部】今日は大丈夫です。p.m.【混合】関東地方における平均的な視野が午後3時より1時間以上発足された。can.【混合】私たちは、ヒレーの家族と連絡を取り合い、できる限り検索と救助活動を支援しています。活動をサポートしています。JParaCrawlはそのまま使うのではなく、かなり気合をいれてクリーニングしたほうが良さそうです。Driveに書き込めなくなったりする不具合などもあって、長時間の学習ではストレスが溜まります。その点、AWS(EC2)だともう少し安心して回しっぱなしにできるはずなので、移行を考えることにしました。