初NLPコンペ@Kaggleで念願のSilver獲得も大反省会

# 背景
CommonLit Readabilty Prizeで、念願のSilver (Top 4%)を取ることができた。
これまでにないほど、時間も金も、リソースは注ぎ込んだので入賞は目指していたが、Silverまでいけると思っていなかったので非常に嬉しい。

しかし、振り返ってみると反省点が多々あるので、自己正当化が始まらないうちに記録に残しておきたい。完全にポエムですが……。

# 良かったところ
### コードは全部自分で書いた。
当たり前と言えば当たり前だが、他人のnotebookのフォークはせず、アイデアだけもらって自分でコーディングしなおした。結果的には、public notebookのアンサンブルでメダル圏内に入ることはできたようだが、自分で書いて、詰まって、解決して、というプロセスを経るとモデルの挙動に敏感になることができた。
私が感じた効能は以下の通り：
* 己のモデルのどこに問題があるのか何となく把握できるようになるので、打ち手を思いつきやすい。
* 全体像も詳細も把握されているため、何か試してみたくなったときに、変更が比較的簡単で、実験を繰り返すことができる。
* 単純にコーディングする力がつくというのもある。ライブラリの公式ドキュメントが読めるようになったり、面倒なnumpyが何となく把握できるようになったり、副次的な効果もバカにならない。
* Stackingがスムーズにできる。


### なりふり構わなかった。
今回は、BERTや自然言語処理関係の本を買いまくり、その上で完璧主義に陥らないように、必要そうなところだけ勉強する、というもったいないことをした。
また、GPUが足りず、Kaggle NotebookだけでなくColabも併用したが、こちらもすぐにGPU上限に達したのでColab Proに課金した。
その上で、Roberta-largeなど、モデルが大きく、かつ実験比較を行う必要があったので、ドライブの容量をあげるべく追加の課金をした。


### 最後まで徹底して詰めた。
終盤の、discussionが静かになってきて、ある程度までいくと「これ以上伸びない」という感覚に囚われて、やることなすこと虚しく感じるフェーズが来るが、それを試行錯誤と習慣（≒惰性）で乗り切った。
正直辛かったが、あの虚しさを乗り越えたからこそ、メダルに手が届いた。

**やり切った！**というのがとても大切なことに気づけた。

一方で、ここには反省の余地もある。


### 学習やコーディングのペースをポモドーロアプリで把握しながら進めた。
時間の測定をすることで、漠然と「たくさん頑張った」ではなく
* どの程度やったのか
* 普段と比べてどうか
* どういうことにどの程度時間がかかりそうか
など把握できた。
今までは、やったつもりになっていた面が多々あったのだと思う。そこが記録をつけることで、明らかにされ、現実と向き合うことになった。
工数配分の観点から、見積もりの技術は非常に重要で、時間のかかりかたを想定してコードの後戻りしやすさを考えながら進めることができたと思っている。

# 悪かったところ
### 後半はチューニングに意識を持っていかれて、別の手法を試していなかった。思考停止に陥っていた。
もうファインチューニングしかないと思い込んでしまい、別の手法を考えることに意識が向いていなかった。
ファインチューニングにしても、optunaの利用などを検討すべきだった。しかし多分、新しいことを学ぶのを無意識で忌避してしまい、それを思いつかないふりをした節がある。
チューニングのために手を動かしていれば、何かやっている、自分は頑張っている、というような言い訳をしていた。成果でそれは測るべきで、今回の場合だとCV, LBのスコアだった。

### コンペの評価の仕方（Bradley-Terry Model）を理解しようとしなかった。めんどくさがってしまった。
結局、上位解法を見ると、データ生成の方法であるこの評価方法をきちんと把握しているか否かが分水嶺になった気がする。
おそらく、このデータ生成手法を把握していると、別の手法を思いつきやすくなったのではないか。
これも考えることを怠った、めんどくさがってしまったことが原因。

### 生活リズムが後半に向かうに従い、崩れていった。
夏で暑いこと、幼少期ぶりにアトピー皮膚炎が悪化して来たこと、コロナワクチンの副作用も理由には数えられる。
ランタイム制限のあるColab Proで、チューニングばかりで、思考停止していたような気がする。
ボーッとした頭で、ひたすらちょびっとパラメータを変えてトライ、という、今にして思えば極めて非創造的なことをしていた。
変なネットサーフィンの回数も増えていた気がする。

### 行き詰まったときにどうするか考えていない。
自分の発想だけでは正直なところ限界がある。
今回はたまたま有力なnotebookが出たからBERTのチューニングはよかったものの、そういう幸運がやってこない可能性は高い。
モデルの中で、変えられる自由度を把握していなくて（ただの線形回帰→Ridge回帰のような）、そもそも思考のテーブルにすら上っていなかった。

上位解法を見ると
* 他分野から発想を得ているもの
* discussionでは言及されてないものの、割とスタンダードな手法
* 過去のコンペから発想を得たもの
などが多々見受けられ、時間方向にも空間方向にも視野の広さと余裕を感じた。

こういうのは普段からの積み重ねがないと、コンペの場面で調査からゼロスタートはなかなかしんどいので、あたりを付けられるくらいには普段から状況を情報収集をしておくべきなのだと感じた。


### 気分転換が上手くできていない。
気分転換という方法もあるが、これまでの人生経験のレパートリーの乏しさ故に、やれることが限られている。コロナ禍による外出制限なども、悪い方向に作用したと思う。
こういうときにそれまでの人生経験で差がつくのだと思うと、やるせない気持ちになる。

中長期的には、世の中にある色々なものに手を出してみることが、その後の人生で何らかの役に立つのだと感じた。そのときには分からなくても、後から振り返るとつながるものがあるはず。

# 本質的に己の何が問題なのか
#### 何かをやらない理由を無意識/意識的に思いついていて、それを言い訳に思考停止している
やってみなければ分からないことが多いのがデータサイエンスであるのだから、グダグダ言い訳をせずに課題に取り掛かって、ダメならダメで次をやれば良いし、うまくいけば儲け物なのだから、それをコードに反映すれば良い。そういう潔さ、割り切りがない。
上手にやろうとしている。効率よくやろうとしている。当たり前といえば当たり前だが、何が役に立つか分からない領域で、そういう既成概念に乗っかってしまうのは認識の甘さというか、無駄が無駄であるか先天的に分かっていない以上、前提が破綻している。

それに気づいていながらも、自分に言い訳をしてしまうあたりに己のいやらしさというか、怠惰、サボり癖を感じる。
（大学で尊敬していた教授であれば、私をボコボコにしていると思う）

考えることを怠ける傾向が、後から振り返ると上記のように多々見受けられ、安定した能力があるか、コンペの最中に成長できているかというと……研鑽の余地が果てしなく残っていると感じた。

#### 時間方向にも空間方向にも視野が狭い
完全に一極集中型というか、これと決めたらそればっかり、みたいな頭の固さがある。
資本は集中投下して閾値を超えないと成果につながらないのは事実である一方、出涸らしになるレベルまで詰めたところで、伸びは限られている。

また、そういうアプローチはだんだん自分自身、面白くなくなってきてしまい、活力も失われる。こういう弊害が大きい。ある程度、面白いと感じていないと、脳が「あれもこれもやってみよう！」みたいなテンションにならず、ブレークスルーが起きない。

一方で、忍耐が試される期間も長いので、匙加減が難しい。少なくとも現状は、1つのことに固執しがちである。


# では次はどうすればいいのか？
基本的には、悪かったところの裏返しをやれば良いと思うが、コンセプトを設定すると以下のようにまとめられると思う。

### 言い訳を自分にさせない仕組みを作る
本質的に自分が怠惰である以上、気合いで乗り切るのは無理。よって、言い訳をさせないように自分を強制するしかないと思う。学習やコーディングの時間を計測して、ペースを把握するのは良い方法だと思う。少なくとも量は把握できる。

情報収集を定期的に行うなどの観点からしても、習慣は非常に重要だ。
慣れてしまえば面倒とも何も感じなくなる。

### なりふり構わない
ただでさえ優秀な人間が大量に集まるなかで、所詮凡人でしかない自分に、カッコつけている余裕など本当にない。金や時間という資本が成果に転換できるなら、惜しみなく投下しないことには、相手も身を削っている以上、勝てるはずがなく、対等に渡り合うことも無理だ。

### 自己認知をしっかりとやれ
飽きが来たり、思考停止に陥っていても、気づけないことが多々あった。後から振り返って「あれは惰性だったな」と気づく始末。こういう無駄な時間を無くすためのベースは自己認知にあると思う。
そして、自己認知のベースには習慣というか、身体の健康がまず存在すると思う。寝不足はもってのほかだ。
時間の計測だと、費やした時間の量は測れるが、質は測れない。どうやって時間当たりの質を高めるか、これが次の課題になりそう。

##### 体調管理について
特殊な精神状態になることで新たな発想が出てくるのであれば、熱があろうが風邪をひいていようが腕が猛烈痛くて朦朧としていようが、コーディングして試行錯誤する価値はあったと思う。
しかし、今回は単に消耗するだけだった。これはパフォーマンスを下げる要因だったので、次回は体調に目を向ける。これも一種の自己認知だと思う。

また、終盤はPCから離れるのが何となく後ろめたくて、ダラダラとパラメータチューニングをしていた。チューニング自体は大切だが、飛躍的なスコアの伸びは期待しづらい。
さっさと寝て、翌朝にスッキリした頭でものを考えた方が良かった。