A Day in the Life

2022年6月24日

カメラバカにつける薬が出版され今日届く。同人誌を書き直しした物が殆どで知らない話が多く、ニヤニヤしながら読む。

最初Kindle版がなかったので、あれ物理だけかなと購入したのだけど、後ほどKindle版も追加されたという。物理本で漫画読むの久しぶりだ、物理は物理で良いのだよなぁ。作中で出てくるセンサーサイズ実寸大サイズも物理だとぴったり。


朝、外を見るとまぁまぁの霧。普段の景色も変わって面白いので散歩に出かける。


Pythonではじめる数理最適化読み進めは、第3章学校のクラス編成まで。成績や性別リーダーシップその他諸々条件の生徒を、制約条件をつけていっていい感じにクラス分けをする。非線形になると計算コストが多大なのでなるべく線形に、新たな制約条件を考えるときには、無理やり今のデータから制約条件を考えるのではなく、前処理でやることを考える(例えば成績順にソートして連番をつけることで線形な制約をつけられる、など)等々、この章も具体例が明確で解りやすいな。裏では行列になっているであろうという感じもこの本とは関係がないが線形代数を学んだおかげでイメージがしやすい。

また、ステップバイステップで、すこしずつ制約をつけていって、都度思った状態になっているか確認する、みたいな実務ではテスト書いてやるような当たり前にやるべきところもきちんとフォーカスを当てていて偉い。

撮影機材α7C/FE 35mm F2.8 ZA

Pythonではじめる数理最適化・ルーメナー M3 / 2022年6月23日

GitHub Copilotが月10$の正式サービスになったらしいので使ってみると、"You are eligible to use GitHub Copilot for free" とな。たいしてOSS貢献していないと思うのだが、ありがたい。なるほど面白いなー。実務でどれぐらい使えるものか、しばらく使ってみよう。といっても最近の実務はBigQuery Console上でSQLしか書いてないのだが…。


最近Kaggleに精を出していたこともあって何も本を読み進められてなかったなー、と積読だったPythonではじめる数理最適化を読み始める。数理モデリングの本を読んでもへー(自分でどう実装できるんだろう)とあまりイメージが掴めなかったのだけど、ライブラリのPuLPを使って主に線形計画問題を解いてく感じで、まず一歩を踏み出せる感がして面白そう。チュートリアルの二章まで読み進める。


小型ランタン、ルーメナー M3を購入。軽量コンパクトで、ちょっとした懐中電灯にもなり、デザインもかわいくて良いな。室内インテリアとしても良い感じ。

撮影機材α7C/FE 55mm F1.8 ZA

2022年6月22日

6月のパスタを食べるべく、garden AUX PARADISへ。コロナ対策アクリルプレートが無くなっていて開放感が溢れる店内。こっちのほうが断然良いなあぁ。細々としたところがオペレーションしやすいように変わっていて、従業員負荷を下げている感があり良いことだ。

撮影機材leica m11/Voigtlander NOKTON classic 35mm F1.4 II SC VM

2022年6月21日

kaggleコンペ終了日。別記事に書いたので一言、いやー楽しかったな。


夜は久しぶりに、さかなバルRENGE。ほそぼそながら法人を作ったのでその祝いの席でもある。RENGEは夜も何食べてもうまいなぁ。

撮影機材ricoh gr iiix

Kaggleコンペ初参加でチームに恵まれ金メダル(8位)だった

今日(2022/06/21)の朝9時がKaggleのコンペ終了の時間。結果は即座に表示されるので、チームメンバーと見守る。結果はPublic LB(サンプルで抽出されたスコア)順位と変わらずの1975チーム中8位で金メダル。Kaggleコンペ初参加でチームに恵まれた幸運の結果であった。

8位記念

チームの解法は英語では公開されていて、日本語でも別途公開されると思うので、ここでは解法ではなく主に初参加の感想を。40日ぐらい前に特許と自然言語処理処理コンペであるU.S. Patent Phrase to Phrase Matchingをやらない?とAota氏に誘ってもらい始める。Kaggleは初学者用の本を読んで練習用タイタニックコンペをやった程度の知識だったので、より具体的な進め方やチームで大切にする時の考え方を教えてもらう。

ツールとしては情報共有にNotion(主にboardでkanban)を使い、作った実装はgithubで共有する。スコアはスプレッドシートにて実装連番ファイルと一緒に記載してく。実装はベタにcpして実装を分岐させていく。はじめはcolabのようなnotebook+保存時差分管理のほうが良いのでは、と思ったのだけど実際やってみるとこちらのほうがファイル単体として比較がしやすく、たくさんの亜種がうまれるので(最終的に100個以上の学習用実装ができた)のでコピペ実装の使い勝手が良い。diffもファイル単位で取れるしね。

スコア管理表

非同期なフロー情報共有はチャットで、同期的なディスカッションは週一の定例ミーティングで行い、その時コンセンサスがとれた手法でベースラインの実装をアップデートしていく。ベースラインは基本Aota氏が良いものを成長させてくれた。最初の方に最良のCVのsplit方法考え確定できたこともデータが積み重なれば積み重なるほどきいてくる。またベースラインを実行すると、スコアだけでなく、そのスコアを算出されるのに必要なメタデータ(例えば前処理後のデータなど)も一緒に保存され、なぜそのスコアが導出されたのかのデータ調査がし易い。

そんな感じでコンペへの取り組みが開始し、それからは今まではゲームなどに費やしていた時間をほぼKaggleに費やす。Kaggleも取り組んでみるとゲームのような中毒性が有り、高得点をとるために何度も何度もあの手この手を試したくなる。初めて取り組んだということもあり、その過程で得る知識も多大で知的好奇心が満ちていく感じで楽しかった。

ただ、初心者がCodeDiscussionで読んで得た知識の真似事で高得点を出せるほど甘い世界ではなく、手元のCVが改善したなとLBで評価するとむしろ逆相関、みたいな状態が中盤発生し少々モチベーションが下がる中、チームでやっているとみんなで進めてる感があるので最低限のモチベーションは発生し、コンペ途中離脱にならずにすんでよかった。少なくとも私の場合、自分ひとりでやってたら途中から取り組まなくなっていただろうなぁ。以下は、完全に逆相関時代のスコア。

逆相関

コンペ締め切り10日前、別のチームでコンペに参加していたRaiii氏Masuda氏と合流し、お互いの手法やアイディアを共有し、その時の最良である無難な形の学習モデルを作り最終提出に向けてアンサンブルを作り始める。その時Raiii氏がもしかしたらうまくいくかもと、締め切り3日前に実装した天才的なアイディアの学習手法で単体モデルスコアでもいきなり30位台に入り込み、それでアンサンブルを作ったらその時点で一気にLB4位へと登り上がる。なおこのアイディアは最初はグラフネットワークでの解法を検討したが、そもそももっと単純な1:Nな問題として考えられるのでシーケンスに突っ込めば良い感じに学習できるんじゃない?とのことで、確かに言われてみれば行けるのかもしれないが、そもそも発想が思いつかない&非常に短時間で実装していたスキルに脱帽である。

LB4位記念

この辺から面白くなりすぎて締め切り間際の土日はほぼずっとKaggleコンペへの取り組みを行い、新しい学習手法で様々なアンサンブルを作ったり、加重アンサンブルの最適結合比率の重みを自動で出す(線形結合なので一意な最適解が求めらられる)ものを取り入れたり(私が貢献したわずかながらの箇所はこれぐらいであろう)、出たスコアのデータ分析をしまくる、という感じでお祭り騒ぎで怒涛の3日感を過ごす。最終的にはCVとLBはほぼ相関するようなスコアが出るようになってきて、最高のCVを信じて提出するデータを決める。締切日の朝はみんなでKPT+雑談しながら結果を見守る、という感じでチームでの連帯感と達成感も得ることが出来た。

最後の方のスコア

最終結果としては冒頭の通り8位で金メダル取得が出来たのだけど、いやー面白かった。良いチームメンバーに恵まれ、様々な知識を増やすことが出来、エキサイティングな状況にも出会えて幸運だった、としか言いようがない。今回は自然言語処理コンペで、使ったTransformersはチュートリアル~初学者向けコースも一通りさらえて、ざっくりとした理解が出来たことも実務で使える実用知識がだいぶ上がったと感じる。他にも様々なジャンルのコンペがあり、未知のジャンルではどれもが新鮮で学べるものしか無い、という感じがする。

Kaggleコンペ初参加はチームに恵まれたこともあって、本当に良かったな~チームメンバーに感謝。ただ真面目に取り組むと1コンペに付き50時間ぐらいの消費は最低でも見込まれるので、時間を捻出出来ない場合コンペ参加は厳しいかもしれない。今回は40日合計80~100時間ぐらいの時間は使ったと思う。逆に時間があれば、取り組んで得られるものは前述の通り多いと感じた。ふつうにゲームと考えても楽しいしね。次も興味がある議題のコンペに参加したいが、個人的にはソロだと途中で挫折してしまいそうなので、継続性とモチベーションのためにもペア以上のチームを組んで参加できたらなーと思う。

加重アンサンブルの最適な重み付けを制約付き線形最小二乗法で求める

先日、Kaggle参加したコンペU.S. Patent Phrase to Phrase Matchinでは、最終局面ではアンサンブル用のモデルをpretrain済みの多様なモデルと複数の最適と思われるパラメータで20個ぐらい作成し、どのモデルをどれぐらいの配合で混ぜると良いのか、というのを色々試した。最終提出したものは、6つのアンサンブル物と9アンサンブル物である。

そうなると、そのアンサンブルの最適な結合重みを人間がモデルの性能とお気持ちを考え決める…、というのはあまり現実的でなく(もちろんドメインエキスパートならそちらのほうが良い結果になることもあろう)、機械が自動で算出してほしい。重みの配合比率を変えて最良のMSEスコアを求めることは、ただの線形結合なので、最適値は一意に算出できるはずと考えてみた。

簡単なデータで考える

このようなデータがあるとする。yは正解の値、Xは各種アンサンブルモデルが予想した値とする。

import numpy as np
y = np.array([0.5, 0.75, 0.25, 1.0, 0.5])
X = np.array([
    [0.52, 0.9, 0.41, 0.99, 0.51],
    [0.52, 0.7, 0.41, 0.99, 0.51],
    [0.48, 0.73, 0.12, 0.97, 0.47],
    [0.45, 0.35, 0.25, 0.9, 0.49],
])

まず単純に各々のX行の MSE を見てみよう。

np.square(X - y).mean(axis=1)
=> array([0.00974, 0.00574, 0.0039 , 0.03452])

続いて純粋に平均で出すとMSEはこちら。単体スコアMSEより悪くなってしまっている。

np.square(X - y).mean(axis=0).mean(axis=0)
=> 0.013475

最小二乗法

最適な係数を求める方法の一つに、最小二乗法(線形回帰)がある。求めてみよう。

from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(X.T, y)
reg.coef_
=> array([ 0.43575566, -0.05397578,  0.46076883,  0.21063718])

負の係数が出てしまったのはさておき、このパラメータを重みの係数として掛け合わせると最小の値が求められると。

X.T @ reg.coef_
=>array([0.51448131, 0.76448131, 0.26448131, 1.01448131, 0.51448131])

確かにスコアに良い感じの値が求められた。のでMSEを求める。良い数値が出た。

np.square(X.T @ reg.coef_ - y).mean(axis=0)
=> 0.00020970822203200185

ただ、そもそもアンサンブルするモデルに負の係数を掛けていいのだっけ?と疑問がわく。係数は正であってほしい。

制約付き最小二乗法で解く

では係数が正になるような制約を入れた最小二乗問題として考える。制約付きの最小二乗法のソルバ実装があれば簡単そうだ。restricted least square method scipyでググると scipy にズバリのものがあった。scipy.optimize.nnlsは非負条件の最小二乗法のソルバなのでこれを使う。

weights, rnorm = scipy.optimize.nnls(X.T, y)
weights
=> array([0.29260857, 0.08404164, 0.52487508, 0.12761238])

正の係数が求められた。これをアンサンブル結合時の重みとして求めてみる。

X.T @ weights
=> array([0.50522372, 0.75      , 0.24931469, 0.99686367, 0.50131296])
np.square(X.T @ weights - y).mean(axis=0)
=> 7.863453999510499e-06

MSEの値は最小値かつ正の係数で求めらた。ので、このような単純な重み分配でアンサンブルの結果を線形結合する場合、scipy.optimize.nnls で解くのが楽で良さそうだ。


これらの重みで算出したアンサンブル結果はCVとLB(publicもprivateも)は相関となり、人間が重みを決めずにささっと最適比率の重みを出せたのは、Kaggleコンペ最終局面の時間がないかつ脳が疲れてきているときには良かったように思える。この例では単純な線形結合の重み付けの場合で、他にもアンサンブルの重み付けは様々な方法があるので、用途用途によって「最適な重み付け」の実装方法は変わってくるであろう。

なお、コンペ終了後に知ったのだけど、この手法はstackingと呼ばれるものの線形問題の解決手法のようだ。他にも自分はLightGBM(GBDT)でコンテキストごとに分けたアンサンブル最適化もやってみたのだけどCV最適化はされるがLBスコア的にはうまく行かず、この話によるとNNは過剰適合しやすいのでGBDTは向いてないとのこだった。なるほど。


線形代数を知っている人は当然のごとく係数を求められると思うが、自分の場合は先日ベクトル・行列からはじめる最適化数学を読んで、初めて線形性とはどのようなものかを(少々)理解することが出来た。この本を読んでいなければ「制約付き(非線形でない)最小二乗法」といったキーワードも思いつかなかったと思う。基礎は大事だなぁ。

2022年6月20日

仕事時間以外はkaggleしていない日。夜からはずっとボイスチャットでチームメンバーと話しつつ、最後の提出用データをあれやこれやと作っていく。脳は疲れていてうまくやれないことも多々ありつつも、みんなで目標に向かってアレコレするの、祭り感があってただひたすら楽しい。

ここ数日は妻が不在のタイミングなのだけど数日分の作りおきの食事を作ってくれたお陰で、食事に全く困らなくて有り難いな。

2022年6月19日

昨日エポックメイキングな出来事(自分で起こした訳では無いが…)があり、脳が活性化しすぎて眠いけど寝れず…という感じになって、明け方までちょっと寝たりすぐ起きたり、を繰り返す。というわけで一日 kaggle な日。は~面白い。日記上で面白い、という言葉をしょっちゅう(ほかの言葉も似たようなものだけど)使っていて、語彙の貧弱さよ。

そしてkaggleのコンペ終了が明日朝かと思っていたら、明後日の朝ということを直前に知る。oh!


FLOWERから花が届く。かれこれ半年ぐらいは続けていて良いサービス。そろそろ暑い季節で、季節柄花が枯れやすいので悲しいのだけど、枯れにくそうなチョイスでいいね。

撮影機材α7C/FE 55mm F1.8 ZA

シェレンバウム創業祭・ラーメンたかはし / 2022年6月18日

朝はシェレンバウム黒磯店でパンを買う。店内は焼きたてのパンの香りが充満していて、朝のパン屋という感じだ。ちょうど創業祭をやっていて、お菓子やら抽選券やらをもらう。抽選はガラポン福引を回す、昔回したのいつ頃だったっけ、懐かしい感じ。抽選では豆乳が当たって、受付の方が申し訳無さそうに「豆乳ですが良かったら…お嫌いでなければ…」と渡してくれ、いやいや豆乳好きですよありがとうございます、と受け取る。たしかに豆乳が嫌いな人もいるのだろうから、そのような渡し方になってしまったのだろうなぁ。

他にも「わなげ」や「射的」などもやっていて、一店舗ながらさながら小さな祭りのよう。子どもたちは楽しいだろうなぁ。良い催し物に出会えた。27周年とのことで、長く続いて欲しい。


遅めの昼食兼夕食は二郎系ラーメンのラーメンたかはしへ。一番量が少ない小で結構なサイズ。野菜マシや肉増しも考えたのだけど、小でお腹いっぱいになった(だいぶ腹ペコだったのに)ので小が正解であった。久しぶりの二郎系、豚骨スープがクリーミーでうまいなぁ。お店の大将から「こんな量じゃお腹すいちゃわない?(笑」ときくさに声をかけられる。お客とのちょっとした会話も楽しそうであった。


kaggle締め切り間際によりほぼkaggleな一日。いろいろあって、いやー面白いなぁ。

撮影機材ricoh gr iiix

2022年6月17日

約二ヶ月ぶりの散髪。前も担当してもらった美容師だったのだけど、前回は無言で今回はテンション高く饒舌でギャップが面白かった。その後は丘散歩。


夜、珍しくビール(というか淡麗グリーンラベル)を飲む。生ビールよりも第三のビールのほうが味が薄くて飲みやすくて好きなのだよなぁ。


葬送のフリーレンの1-8巻、つまり既刊全巻を読む。人気作だったのでなんとなく読んでいなかったのだけど、1巻を読んだらしんみり面白く一気に読んでしまった。故人を偲ぶ系ファンタジー。ストーリーも良いが絵の書き込みもすごいなぁ。原作と作画が別れていることの相乗効果。


2022年度の人工知能学会全国大会があり、いくつか資料を読む。自然言語処理とVision-and-LanguageはTransformerの初期実装であるBertの仕組みをざっくり解説し~最近のマルチモーダル処理(言語+画像など)がわかりやすくまとまっているし、Transformerの最前線 〜 畳込みニューラルネットワークの先へ 〜は最新論文各種の話が詰まっていてこれも面白い、プレゼン資料の勢いを感じられる。両方ともTransformerの話が主で、近年のTransformerの活用されっぷりが思い知れる。

撮影機材ricoh gr iiix