JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

AI Blitzは機械学習入門に最適?年末年始に参加したのでレポ。

AIcrowd が主催しているコンペ、AI Blitzの#12に参加したのでそのときの結果と解法を記録としてブログに残しておこうと思います。

AIcrowdで開催されるコンペってKaggleよりエンターテイメント性のあるユニークなコンペが多く、前々から興味はあったんですよね。

これを書いている今も、「Learn-to-Race環境を使った自動運転カーのレース」「ドローンの自律飛行コンペ」「NetHack (https://ja.wikipedia.org/wiki/NetHack)を攻略するエージェントのコンペ」等々が開催されていて、どれも面白そうです。

その一方で、これまでなかなか時間が取れず参加に踏み切れてませんでした。
今回はちょうど年末年始 実家に帰省していた数日とコンペの開催時期が重なっていたので参加してみました。

AI Blitzとは

AIcrowdが主催となって定期的に開催しており、初心者〜専門家すべての人が参加し楽しめることを目的とした入門的な位置付けのコンペになります。

三週間の開催期間で5問の問題を解き、それらのスコアを競います。
それぞれの問題にはウェイトがあり、1問目が最もウェイトが低く5問目が最も高くなっています。

元々はジャンルを問わない平易な問題のみで構成されていたのですが、最近は「テーマを絞った様々な難易度の5問」に方針転換したように見えます。
ちなみに今回は「自然言語処理」がテーマでした。

平易な問題とはいえそれが機械学習の問題である以上、解答作成からの試行錯誤〜学習のサイクルはかなり時間を要します。 それが5問でなおかつ三週間となると・・・ガチで優勝狙うとすると結構大変なコンペだと感じました。


ここから本題。各問題について。

※ 正確な実験記録を残したり手法の比較や考察を目的としはしていません。ただの日記です。

1. Programming Language Classification

テキストデータを15種のプログラミング言語のうちどれかに分類する問題。
1問目だけあってとてもオーソドックスな問題ですね。

教師データとしては、以下のようにソースコードの一部が提供されます。これはC++

    // creating lookup table for palindrome checking

     std::vector<std::vector<bool> > is_palindrome(n,

                                                   std::vector<bool>(n, false));

     // initialization

     for (int i = 0; i < n; i++) {

         is_palindrome[i][i] = true;

ちなみに、数値列や文字列リテラルだけしかないものやコメントだけのものなど一筋縄ではいかないデータもそこそこ混ざっています。以下の答えはrubyらしいです。わかんねえ。

    // graph is represented as an array of edges.

     // Since the graph is undirected, the edge

     // from src to dest is also edge from dest

解法と結果

単純にスペース区切りで文書をベクトル化(トークンのインデックスを並べた最もシンプルなもの)して、LSTMにぶっこみました。

ボキャブラリーを見ると前処理として甘すぎることが明白なんですが、1問目ということでスコアに対するウェイトが低いので時間は割きませんでした。

因みに特別な前処理が必要なく手っ取り早く試せるやり方として、文字単位でベクトル化して同じモデルに突っ込んでみたんですけどイマイチな結果となりました。

スコアは、F1 0.697 / Accuracy 0.691

これでソリューションサンプルとして提供されているTFIDF +ナイーブベイズより大分良い結果となってるのですが、結果は 61チーム中 40位 とふるいませんでした。

2. Speaker Identification

10人の機械学習系Youtuberの動画の字幕がデータとして与えられるので、これらをその人ごとに分類(教示なし)しろ、という問題。

具体的なデータとしては以下のようなものになります。(1行が1つのデータ)

If you sit back and think about all that, that’s a lot of layers of complexity to wrap your mind around. So don't worry if it takes time for your mind to digest it all.
oh my goodness i've run it again i wasn't meant to click that that's all right it should still work and then gradio look how easy it turns your python functions into an interface so if i type in my name daniel submit is this going to work oh no because the cell's not running that's all right ignore that we want to go for the big dog demo
And now, let’s use this new technique to apply some more magic to this image. This is where the goodness happens. And, oh my, it does not disappoint!

これを見て、教師なしで10クラスタに分類すると・・・。因みにトピックはバラバラなので、LDAなどの手法は今回適しません。(一応試しましたが全然ダメ)

前置詞の使い方や感嘆符の使い方・・などなどを多分特徴として捉えるんでしょうけど正直見てもさっぱりです。(これが母国語ならもう少し解像度高く見れるんでしょうけど)

今回のAIBlitzで最も無理ゲーさを感じた問題です。

解法と結果

最初は全然振るわなくて、ソリューションサンプルのTFIDF + k-means++のシンプルな方法に対してすら敵いませんでした。
例えば特徴的な口癖がある、みたいなものがない限り中々TFIDFで話し方の特徴を捉えようとするのは無理があると思うので、これにかなわないのは辛いところ。

そんな中、doc2vecの学習windowを1にして学習するというやり方が比較的うまくいくことがわかりました。
word2vecによる分散表現の取得には、ある程度のwindowを取ることで文書のコンテキストを捉えて学習することができます。

windowを1にすると隣接した単語からのみで当該単語の分散表現を学習することになります。これでは文脈を捉えることは当然できませんが、逆に局所的な話し方の癖は捉えられるんじゃないかな、と考えました。知らんけど。

最終的には、これで得た特徴量をもとにk-means++でクラスタリングして解答としています。

結果は なんと 39チーム中 1位。 やったー!

f:id:sakata_harumi:20220206191204p:plain

3. Lingua Franca Translation

きました。翻訳問題です。 CrowdTalkと呼ばれるアルファベットで記述された架空の言語を英語に翻訳するというタスクです。

crowd talkとenglishの対応例はこんな感じで、当然ですが英単語と1:1で対応するわけではないので、ちゃんと翻訳機を作らないといけません。

(crowd talk)
wraov driourth wreury hyuirf schneiald chix loir schloors rhiuny pfaiacts
(english)
upon this ladder one of them mounted
(crowd talk)
treuns schleangly kriaors draotz pfiews schlioncy yoik gaiacts schneiald chix augustus luag rhairk gnoirk cziourk mcmaaght gnoirk cziourk wrauebs rhiorf ghiicy jist
(english)
and solicited at the court of Augustus to be preferred to a greater ship

実は今回、この問題に取り組みたいがために参加しました。

昨今、TransformerがNLP界隈を超えて話題沸騰中ですが、なかなかじっくりとキャッチアップする時間が取れず・・。いつかちゃんと勉強しないとなと思ってたんですよね。

そこで、今回この問題に取り組む過程でTransfomerを実装しつつ理論を学べれば良いなと思いまして。
なので、年末年始の半分以上はAIBlitzに参加というより、Transformerの勉強の時間になりました。

解法と結果

当然Transformerで挑みました。時間的にも厳しかったので比較手法として他の実装はしていません。
位置エンコーディングやMulti-Head Self-Attentionの実装も合っているはず。
位置エンコーディングののようなシンプルかつ強力な発想は気持ちが良いですね。あり・なしで比較実験もしたかった。

結果はBLEUスコアが0.635で 34チーム中 6位。

悪くはないもののハイパーパラメータが元論文のままで調整できておらず、もう少し頑張りたかったという思いはあります。
ただ、じっくり勉強する時間は取れたし実装もできたので満足です。

4. Embedding Game

まず、教師データとして単語とそれに対応する分散表現が与えられます。

"[0.525386, 0.61333424, 0.62004805, ......]",exchanges
"[0.6212443, 0.53205186, 0.5439351, 0.5772528, .....]",remainder

で、分散表現だけのデータと単語リストが与えられます。
問題は、その分散表現に対応する単語を単語リストから当てる、というものになります

当然ですが、単語リストの単語は教師データに含まれていません。

デコードする術を失ってしまったが、分散表現からテキストデータを復元したい・・みたいなシチュエーションらしいです。ユニークな問題で面白いですね

解法と結果

  1. 予測対象となるベクトルAと最もcos類似度が高い単語Bを教師データから算出する
  2. 学習済みword2vecモデルに対して単語Bのベクトルを得る
  3. 単語リストの分散表現を学習済みword2vecモデルで得て、それと単語Bのベクトルとのcos類似度が最も高い単語を解答とする

という形で推測しました。ただ、パブリックなデータセットはレギュレーション上、利用できないのでSpeaker Identificationで提供されたデータを利用してword2vecモデルを学習させています。(ありなのか?)

学習済みword2vecのボキャブラリーにないものは予測できないので、ボキャブラリーに存在する中から意味が近そうな単語に置き換えてゴリ押しました。

というか、(1)ができたらあとは単語リストから人力で最も意味が近そうな単語を選ぶことができますね。もしかするとそれが一番精度良かったりするのかも。
これはトップスコアの人のソリューションを見てみたいです。

結果は Accuracyが0.683で 26チーム中 6位

5. NLP Feature Engineering #2

これも独特な問題で、前処理をするコードと予測するコードを提出物とします。

コードを提出すると、コンペ用の実行環境下で提出したコード(前処理やモデルの学習)が実行され、文書のベクトル表現を得ます。

その文書ベクトルを使って、何らかの分類問題を解くための、何らかのモデル(参加者にはわからない)がトレーニングされ、そのモデルを使った分類問題のスコアで競います。


自分達はどんなテキストデータが、どんな問題を解くために利用されるのかわかりません。とにかくどんなデータであったとしても良い感じに文書の特徴をベクトル化するような前処理コードを作れというお題です。

解法と結果

提出の方法が独特故に、以下の理由から「正しく提出をすること」自体にハードルを感じました。

  • 学習時間の制限や利用できるメモリの制限、そもそもGPU環境下ではないなど実行環境の制約条件がわからない
  • 向こうの実行環境で落ちても何が原因で落ちたのかわからない(どのフェーズで落ちたのかはわかるものの・・)

ソリューションの方も、コーパスサイズとかコーパス自体の特徴は考慮できないのにどうすれば良いんだ・・と全然良いアイデアが思い浮かびませんでした。
多分、ブラックボックスな状態に対して試行錯誤して最適な特徴量抽出の方法を検討していくんですかね・・?十分な時間も取れず不完全燃焼でした。

細かい事は色々やっていますが、大枠としては実行時間制限に収まるよう調整の上doc2vecでトレーニングし、そのモデルで分散表現を得るというシンプルな形でとりあえず提出しました・・。

結果はF1 Scoreが0.405 Accuracyが0.410 で 19チーム中11位。
自分より下のチームはソリューションサンプルのスコアを上回っていないので実質自分が最底辺みたいなところ。

総評

総合結果は、 73チーム中 9位 。惜しくも(惜しくないけど)賞金には届きませんでした・・。でも、目的であったTransformerのキャッチアップはできたので満足です。

次はGWあたりにでもタイミングがあえばコンペに参加してみようと思います(๑╹ω╹๑ )

f:id:sakata_harumi:20220207020725p:plain

なかなかコンペに参加する時間のない社会人の方も、AI Blitzであれば簡単な問題1問から参加できるので参加のハードルが非常に低いです。
1問でも解いて、その問題でリーダーボード上位にのるだけでも良いモチベーションになります(๑╹ω╹๑ )

また、機械学習はじめてみましたな方も、様々なジャンルの王道な問題からちょっとユニークな問題まで揃っているAIBlitz、練習問題としてもおすすめです!

そんなAI Blitzですが、ちょうど昨日あたりから、2022/02/25 12:00 (UTC )までの三週間、「顔認識」をテーマとしたAI Blitzが開催されています!

問題は全5問、「感情分類」「年齢予測」「マスク予測」「顔認識」「顔のぼやけ除去」
AI Blitzらしくベーシックな予測の問題から画像のセグメンテーションや超解像といったトレンドのトピックを扱う問題まで幅広く揃っていますね!

参加はこちらから。

www.aicrowd.com