周回遅れでIT業界デビューしたエンジニアのブログ

就職氷河期にモロにぶち当たり、人生で混迷を極めた末にIT業界に安寧を見出そうとしているアラフォーのお勉強日記です。

kaggleメルカリコンペの表彰式イベントに参加してきました

f:id:sionff:20180510182129j:plain

2018/5/9(水)に表題のイベントに参加してきました。
kaggle関連の催しは初めてなのでワクワク。

お話を聞きながらタイピングしてそのまま載せているので、多少間違っているところがあるかもしれません。あらかじめご容赦下さい。

メルカリコンペの趣旨

海外から入賞者を招き、同時通訳を用意するなどしてイベントのために1000万かけた。
日本人のkaggler少ないな、もっと活性化したい!
という想いで、ハウツーを共有するためにイベントを開催した。

第一部

1位のお二人

3つの異なるデータセット
データセットにつき4つのモデル
いくつか使った方が品質が上がる
スコアを高くするためにも色々な施策を試した
Sparseのデータセットを使って、4モデルを同時に学習させた
テキストの結合をさせることが大事だった
宣言型と命令型の前処理をした
とても複雑なコードを使ったので理解しづらくなっている

前処理の定義
コードの実行の仕方の違い
宣言型と命令型、2つ
GitHubに載せたのでぜひ見てください
パイプラインが最初から最後まである感じ

前処理の仕方
互換処理、ステミング、互換の抽出
他には文字の抽出1,2グラム

なぜアンサンブルしたのか?
様々なモデル、データセットを使用したプロジェクトになった

データの多様性をグラフで明示
12種類の同じようなデータセットを1つにした場合
やりやすいのは4モデルずつ3つのデータセットに分けること

色々な仕掛けを大会に参加しながら進展していく毎に学んでいくということがあった

見つけた仕掛け
sparseMLP feedforward neural network
いくつかのカテゴリがあるときに、いくつかのレベルに分けて分析する

なぜMLP
学習が早い
CPUでもとてもすごく早い
普通のアーキテクチャレベルで対応できる
実行に関してはTensorflowを使った

3位の方

2つのモデルを使用、NNとFM
NN:学習には40分かかる、テクスチャ特徴
FN:学習には20分

特徴について
ほとんどのアイテムが女性のもの
リサイクルショップ、種類豊富にアイテムを取り揃えている

特定不可能な記号を排除 ^@|{

BLEU
Nグラムをチェックしたうえで翻訳の類似性を評価する

各特徴の説明
アイテム名はブランド名を含まない場合があ多いため、それらを連結した
説明は64~72文字

NNのストラクチャを作ることに時間を費やした
小さなバッチサイズがあるときにモデルを頻繁にアップデートする必要がある
女性のもののためにモデルの微調整も行った

ラーニングレートの学習にも時間を費やした
バッチサイズとオプティマイザについての説明
最初は907→907→1027→1127→1424→1424というようにだんだん大きくしていく

パラメータがとても多いために、過学習がおきがち
エポックは10以下に抑える必要があった

誤字を修正する必要があった。
(iPhone7の、アルファベットと数字の間にスペースがあるなど)

降下をもっと簡単にできるように工夫した

4位の方

前処理
少ない数のインプットタイプで対応
テキスト、カテゴリ

使ったモデルはDeepFM
DeepFMモデルのリサーチを今までたくさんやってきたが、このアーキテクチャの適用するのが良いと分かったので使った

Text Embedding Layer
テキスト埋め込み部分
IDを入れてEmbedding、単語を入れて、エンコーダにかけると文章のマトリクスができる
ローカル、もしくはグローバルの内容のテキストを取得

FMモデル
異なるフィールド間の相互作用をモデル化する
FMをモデルにしながら、Tensorflowを使うことが推奨されている
最初の2つはセンテンスベクトル、アイテムの説明のセンテンスベクトル
これらはハイレベルな処理を実行するためのもの

DNN Layer
Pure MLPを使用
レスネットはちょっと遅いので、最終的には効率的で正確なMLPを使うことにした

学習のメソッド
Lazy Nadam
他で試したオプティマイザよりもすぐれていたのでそれを利用した

Snapshot Ensemble
三次元グラフで流れを説明
ローカルの最低値を探す

アンサンブルの集め方

Snapshot Ensemble
最初のエポックでは通常数値が衰退していく
注目したいのは最後のエポックの数値

効率性
モデルでは、FastText+AvaragePoolingを使用
Snapshot EnsembleとLR Restartsを使用
ループの外でバインディングメソッドを使用

GitHubに掲載したのでよかったら参考にして下さい

ここまでのQ&A

Q)
kaggleをやろうと思ったモチベーションは?

A)
1位の方A
そもそも機械学習に興味があった。コミュニティに参加するようになったら、kaggleに興味がわいた。その時の仕事が機械学習に特化したものであったので、さらに知識を深めたいと思ったのが一番の理由

1位の方B
7年位前に機械学習を始めた。Android Incというコースを受けて、講義で学んだことを活かしてみたいと思ったから。kaggleは本当にハマってしまうので学ぶのは簡単だった。やればやるほど点数が上がるのでそれがモチベーションになる。

3位の方
機械学習は1年前に始めた。1年前からものすごく興味を持ち、最初の大会に出たのは中国にいたとき。kaggleを通じて様々な参加者と交流することが楽しい

4位の方
2013年にcourseraの授業を受けて、kaggleがどんなことをするか詳細を学んで、その際に興味を深めた。やはりkaggleを通じて学んだことを使ってスキルを試せるのがモチベーションになる


Q)
やりすぎるとモチベーションが下がることもあるけれど、モチベーションを保つ方法は?

A)
1位の方B
Kaggleに意識を集中すること


Q)
どうやってkaggleのコンペに勝つ? こうしたらいいよ、みたいな秘密があれば

A)
1位の方A
勝つために大事なことは、kaggleの優勝者が何をするかをイメージする。誰でもできることをやっても意味がないので、自分のやっていることを改善していく、どんなことをやっていけるのかイメージして突き進むのが大事。あとはkaggleの中でも大会で求められることが変わってくるので、何を求められているか理解する

1位の方B
まず、チームメイトが1位で自分が2位だった時に、勝ちたいと思った。競争心。どれだけ時間を費やすかが関係してくる、簡単に答えはないけれどそれだけの時間を費やして一生懸命やる

3位の方
時間を費やすことが大事。もうひとつ言えるのはイマジネーション、想像すること。知識やスキルよりも大事。どうやったら結果がかえって来るのか、柔軟に想像しながら行動する。イメージに突き進む

4位の方
一番大事なのはどれだけ努力をするか。時間をすごくかけないとできないし、大会に勝つためにはいろいろなアプローチを試さなくてはいけない。処理も色々試す必要がある。それが他の人と自分とを分けるモチベーション

Q)
どういったソフトウェア、ハードウェアを使っている? ハードウェアの制限だったり難しい局面に直面したことはある?

A)
4位の方
いくつか得た情報を使いながらモデルをビルドした

3位の方
kaggleのコミュニティでよく使われているものを積極的に採用した。FMモデルを作成する際のツールには苦労した。Pythonのライブラリがすごく大事。kaggleのカーネルもかなり使った。karnelを使ったタイプのコンペはとても好き

1位の方B
一般的なツールを使っている。大事だと思うのは自分独自の機械学習アルゴリズムを使用すること。自分のアルゴリズムを実行するのは必ずしも成功につながるものではないが、とても良い経験になる

1位の方A
ハードウェアに関して言うと自分のワークステーションがあったので、ノートを使わなくて済んだので楽だった。学習するときに夜通ししなくてはいけないときは、それが重要。

Q)
Rawデータは大事?
(特徴量のエンジニアリングにおいて、生データはどれだけ大事か)

A)
1位の方A
特徴量エンジニアリングをしないとこういった大会に勝つことは難しい。特徴に関して言うと全てRawデータから集めたもの

1位の方B
チームメイトに同意する。ただし特徴量エンジニアリングは時としてやりすぎる

3位の方
モデルは必ずしもすごく賢いわけではないので、学習させることが大事になってくる。特徴量を見つけるというよりは、学習をさせてモデルを賢くしていくことが大事。個人的には特徴エンジニアリングはすごく大事。やればやるほど質が良くなる

4位の方
データを集めた際にそれが何の特徴か分からないこともあった。ID等で何も使えないなど。Rawデータであれば特徴量が取れるしエンジニアリングしていけるので大事にして欲しい


第二部

takapt氏、中尾氏、佐藤氏、メルカリ上田氏


Q)
kaggleを始めたきっかけは?

A)
中尾氏
未経験でMLエンジニアを目指すとなると突破口が必要になるが、kaggleがきっかけになる

takapt氏
元々競技プログラミングをしていた。機械学習を触って1年くらい、競うのが好きなのでkaggleも自然に始めた。競技プログラミングとkaggleとの関連性はそんなにないと感じている

Q)
kaggleをやっていてよかったこと

A)
中尾氏
実務でMLを適用しようとすると同じタスクが多くなりがち、kaggleだと色々な世界に触れることができるので面白いと思う

佐藤氏
kaggleを一緒にやる仲間が出来た

takapt氏
楽しい。kaggleをやっているときは生きている感じがする。

※メルカリでもkaggle部が出来て活動しているそうです。

Q)
物を作ったり設計したりプログラミングにいい影響は?

A)
takapt氏
kaggleのときはぱぱっと出来るようになった

上田氏
世界1位の方との差が分かるのが面白い

Q)
メルカリの実データに近いものをコンペで使用したが、特徴エンジニアリングはどうした?

A)
takapt氏
自然言語エンジニアリングに関することを片っ端からやった。karnelの既存ライブラリの仕様の見落としに気づくことも大事。気づかずにデータ欠損していたりする。NLPに関しては、100個以上の特徴量を試した。ベクタライザ使用

佐藤氏
自然言語処理は同じくやった。価格に関するブレストもやった。今回は時間制限があったので特徴量は少なくすることが大事だと感じた

中尾氏
コンペのkarnelを参考にしていたりもする。いいものを見つけたり

Q)
モデルの選定方法の基準は?

A)
takapt氏
始めた時点で一番強いkarnelを参考にした。そのあと、アンサンブルしたり色々試した。基本的にスコアが上がったかのバリデーションはローカルでやって、時間制限関連はkarnelで実施。リッジ回帰の時は並列処理したり

佐藤氏
いろいろかけてみていいものを使う

中尾氏
既存karnelを参考にしている。今回でいうとXGBoostやライトGPUのようなものを使った。そのあとアンサンブル

Q)
karnelベースと、なしとどっちがいい?

A)
takapt氏
karnelベースの方がいい。なしだとクレイジーアンサンブルなど何でもありありなので

Q)
kagglerならではの悩みはあるか?

A)
takapt氏
仕事が終わったらkaggle、土日はkaggle。つらいのも楽しみのうち

佐藤氏
コンペによってはデータのサイズがまちまちなので大きいサイズだとなかなか参加しづらいのもある。小さいサイズのものが最近は少なくて残念

中尾氏
仕事とkaggle一色になる。(いまは仕事中に20%くらい時間が割けるが…)

Q)
上位入賞するには?

A)
takapt氏
karnelを読むなどしながら時間を割くこと。初めて参加したQuoraコンペではkarnelで調べて分からなかったら他で。論文は罠かも。直接役に立つことはあまりなくkaggleの順位にも直結しない。が、知識にはなる

佐藤氏
最初にひたすらkarnelを見る。30個ぐらい見ると方針が立つ。されていなさそうな事にも着手する


※ どうすれば上位に入賞できるかの傾向は思いのほか似ているらしい?

Q)
メルカリに質問。コンペを主催した嬉しさは?

A)
実際にメルカリUSで使っているもの。上位の方のはベースラインよりよいモデルで普通に応用できるレベル。単純にプログラムを使えるのがいいこと

Q)
NLPとしては基本的なことをしているように見えたが、他には何か特別なことを?

A)
takapt氏
ステミングなどはしたが、全くスコアが上がらなかったので最終的にはしなかった

佐藤氏
絵文字を適切な単語に置き換えたりは時間をかけた。kaggleは不毛な戦いの所もあって、ちょっとしたスコアアップをたくさんの時間をかけることもある

Q)
各コンペで共通のアプローチをしたあと何をもって方針を立てているのか?(方針を立てるまでのプロセスが知りたい)

A)
takapt氏
問題をちゃんと理解する。イコール、データを見る。価格の分布がどうなっているかなど。そこからkarnelを参考にしながら進める

佐藤氏
機械学習のワークフローがあると思っていて、しっかり問題を定義する必要がある。そもそもデータがない場合もあるので設計から考えることも。データをきちんと理解していくことが大事。あとはtakapt氏と同じ

Q)
本気に勝ちに行きたいとき、残り日数どれくらいから参加するなど決めているか?

A)
takapt氏
終了2カ月前くらいからやれば大体できる。1か月だと足りない

佐藤氏
だいたい終了1か月前から参加している

Q)
チームで参加したときの感じは? コントリビュートしている人とそうでない人への対策は?

A)
佐藤氏
学校の生徒でやっていたので、タスクを明確にした。Trelloを使った。3つくらいチームがあって1チームは1人だけしか参加していないこともあった

takapt氏
Quoraのときは社内で仲の良い人と一緒にやった。2人チームだったのでゴースト問題はなかったが、シルバーが取れたのはチームメイトのおかげ。専門分野が違ったのもある

ここまで駆け足でお送りしました。

主催&登壇者の皆様、ありがとうございました!
こういう話を聞くと、kaggleやりたくなりますよね。