Python奮闘記

主にPythonのことを書くつもりだったけど、プログラミング周り全般の備忘録ということにした。大体競プロ。

フォルシアサマーインターン参加記

フォルシア株式会社のサマーインターン(5日間)に参加してきました。 記録は残しておいた方がいいかな、ということでつらつら書きます。なんか長くなったので適宜読み飛ばしてください。

きっかけから参加まで

5月ごろからインターンは探していた。今年はコロナ情勢ということもあって、インターンできなかったら就活やばいんじゃねと軽くビビっていた。 でも夏は学会やら何やら忙しくて、数週間の開発!みたいなガッツリ系は結構厳し目な見込みだった。 やったことない言語で開発するのも、キャッチアップできなかったら怖いなあと思っていたので、ある程度自分のスキルセットに合致するというのも重視していた。

フォルシアのインターンAtCoder Jobsで見つけた。コース概要を覗いてみると、何やら面白そうな感じ。5日間なら参加できそうだし。 主に開発系コースとデータサイエンス系のコースがあった。そういえばデータサイエンスとかってやったことないな。どんな感じなんだろ、と思ってとりあえず申し込みボタンをポチった。まあRustで開発できる自信がなかったというのもあるけど....

書類審査(プロフィールを見られたのかな?)後、面接があった。 面接した人が最終的にメンターさんなのだが、あまり面接という感じはしなくて、世間話をしてたら終わってしまった(え?)。 これは面接として機能しているんだろうかと疑問に思ったが、数週間後に合格の連絡がきた。

課題概要

簡単にいえば、(お客さんの)広告にかけるコストを最適化してくれ、ということだった。 広告にかけるコストを上げれば結果として売り上げは上がるが、売り上げが伸びたからといって広告に多額の費用を費やしていたら意味ないよね。 ということで、最適な広告コスト設定を考える、というのが課題だ。

広告はネット上のもので、現状のコスト、サイトへのクリック数、売り上げ、などなどのデータが与えられるのでそれらを眺めて色々考えてみてくださいね、という感じだった。手法はお任せしますということだった。

開催前にこの概要を聞いたときは結構楽観視していた。ただのパラメータ最適化問題に見える。影響を数式で表すことさえできれば、お得意の(?)探索を実装すればいいんじゃないか?という見込みだった。

〜業務編〜

まずは課題のこと中心でタラタラ書きます。適当に読み飛ばしてください。

初日

インターンは全日オフィスで行われた。 新宿というだけで結構ビビってしまうが、オフィスが駅の目の前にあってさらにたまげてしまった。 家の中の快適さに慣れてしまった半ニートには、少々刺激が強かったかもしれない。

集合時刻に集まった学生は自分を含めて3人だった。思ったより少ない。コースもうちょいあった気がしたが、別日程なのかな。 午前中は書類の手続きや自己紹介、注意事項の説明などの予定だった。 書類仕事の合間に、他のインターン生と少しずつ会話して仲を深めた。コースは別々だったので一緒に同じことをやるわけではないが、まあせっかくだし。なお全員東大生だった。やっぱ優秀な人が通ってくるということなのか、こええ...。

午前の最後にキックオフミーティングがあり、メンターさんやインターン運営チームの紹介があった。ここで「みなさんは○倍の倍率の選考をくぐり抜けてここにいるので、ぜひ頑張ってください!」といった趣旨のことを言われ、インターン生一同ビビる。 結構綿密にスケジュールが組まれており、ランチにどの社員さんが連れて行ってくれるかとかまで決まっていた。すげえ。 初日はメンター3人+インターン生3人でのお昼だった。「なんで申し込んだの」「普段何やってるの」とか色々話題になった。 なお昼食後、インターン生のうちの1人の正体に気づいてしまう。(長くなりそうなのであとで詳しく書く)

午後から作業に入る。 結果からいうと、初日はデータを眺めるので終わってしまった。 というのも、広告のコストと売り上げにはある程度相関があるものと思っていたが、実際に可視化してみるとどうもそうでもないっぽいことがわかったからである。 しかも想像していたのとは違って、単一の広告を運用するのではなく、運用するページが何個もあるような状態だった。 なのでパラメータが多数ある状態で、コストの割合を抑えつつ、全体としての売り上げを最大化しなくてはならなくなった。 相関があればなんらかの関数を設定してフィッティングし、その関数を元に解を探索すればいいんじゃないか、という自分の目論見は初日で崩れ去ることになった。

さらにいえば、データはエクセルファイルで渡されたのだが、これを使いこなすのもちょっと手間取った。pandasは触ったことはあったが、何も見ずにサラサラ書けるというわけではなかったので、時間がかかってしまった。この辺は開催前に確認しておいてもよかったな...。

あっという間に時間は過ぎ、初日の作業時間は終わった。あまり残業はして欲しくない主義だったようだ。作業は時間内で頑張って、時間になったらさっさと帰りましょうという感じだった。1日の終わりには夕会(その日やったことなどを軽く報告する会)があった。他のインターン生がやってることを知れたり、メンターさんからアドバイスをもらえたり、刺激になった。

初日は色々刺激が強かったのか本当に疲れてしまって、帰宅したらほぼすぐに寝てしまった。

2日目

眠かった。初日はノリでなんとかなった感あるが、先週まで10時起きだったのが8時起きになったので。でも二日目からは家からオフィスまでのルートが最適化された(電車の乗る位置とか)ので、予定より早く着くようになった。その分早く作業にとりかかれたのはよかった。 相変わらずデータを眺めていて、うんうん唸っていた。見かねたのか、メンターさんに「毎年そんなもんです」と励まされる。それでもうんうん唸っていると、前年のインターン生のとったアプローチとかを教えてくれた。前年の人もこんな感じで唸っていたが、最終的に得意の強化学習でなんとかしたらしい。そして、メンターさんから「もちろん最終ゴールは売り上げが最大化するような方法を考えることだけど、究極的には君が頭を使って考えることに意味があるんだ」という趣旨のことを言われる。

実際に運用する気持ちになってもう少し考えると、「現在うまくいってるものはコストをさらに費やし、うまくいってないものはコストを減らす」という当たり前の着想を得る。メンターさんも同じようなことを考えていたらしい。「ベイズ推定というのがキーワードですね」と言われてポカンとしてしまった。知らなかった。なのでこの日の残り時間はベイズ推定を勉強していた。

あんまりこれといった見通しも立たず、この日は割と落ち込んでいた。夕会で「まあそんなもんです」とまた励まされる。

3日目

3日目、寝て覚めたら謎の自信が湧いてきて、なんとでもなるという自信が出てきた。今後どう進めるかの流れを決めた。具体的には、

  1. コストから売り上げまでの影響を与える関数を決める
  2. 売り上げの変化をどのようにコスト設定にフィードバックするのか考える
  3. 決めたモデルに従って、実際のデータに対するコスト設定を見積もる
  4. 決めたコスト設定での運用をモデルに従ってシミュレーション

という風にすることにした。3,4はPythonで実装することにした。

ここまで決めると、ある程度見通しがたったためか安心感が生まれた。でも一方で残り3日でこんなにできるのか?という気持ちになった。

3日目はコスト設定見積もりのスクリプト実装までやった。ただ、 相変わらずpandasの扱いに慣れず、思ったより手間取った。クエリの取り方とか。これO(N2)になってね?とか気にし始めてごちゃごちゃやっていた。データ数は5000くらいだったのでO(N2)だと若干遅い。結局慣れてるPythonのdictに頼ってしまったが、本当はいいやり方あるんだろうな。。

データをデータフレームから一旦取り出すときは、クラスを使うようにした。実際これがあとでカラム追加したいときに役に立った。お、なんか開発人間っぽいぞ、と思う一方で、pandasに慣れていればいらない工夫なんだろうなあ、とも感じていた。

4日目

終わりが近い。かなり焦っていた。ちなみにここまでくると朝起きてからの行動も最適化されてきて、出社指定時刻の45分前には到着してしまっていた(は?)。

この日は残りの「シミュレータを組む」という作業をやることになった。 ただこれがまた大変な作業で、エクセルファイルに空欄があったりして例外処理めんどくせーと思ってるうちに4日目が終わろうとしていた。時間経つの早過ぎない?

一応この日のうちに一通り回せる程度まで完成はさせた。が、どうも挙動がおかしく、売り上げが元の60倍になるという結果が出てきた(は?)。 よく調べたらそもそも使うデータに欠陥があって、次の日にデータを変えようということになった。

夕会では他の人はかなり順調に作業を進めているということがわかり、自分の無力さをまざまざと感じてしまった。

最終日

最終日の夕方ごろから成果発表会があり、やったことを社員さんに発表する。その準備もあるため、実質的な作業はこの日の午前で終わりだった。

最終日ともなると出勤最適化もかなり洗練してきて、オフィスに集合の1時間前についてしまった。社員数人しかオフィスにいなかった。静かでちょっと心地よかった。

さて、昨日の不具合だが、データを変えてみたところ...それらしい結果は出てきた。が、「うまくいかないものを切る」の方が強く作用してしまったのか、売り上げは落ち込んでしまった。コストを上げたものに関しては売り上げは伸びて欲しかったのだが、どうも芳しくなかった。 モデルの関数を変えたりしてはみたが、あまり結果に影響はなかった。うんうん唸ってたら午前が終わってしまった。うーん、悔しい。

2時間クオリティでスライドを作ったのち、発表会で発表をした。結果は本当に微妙なものなので炎上したりしないか心配だったが、社員さんたちはすごく熱心に聞いてくださった。おかげで発表自体は滞りなく進めることができた。質問も別に責め立てるようなものでもなく、単純に興味があったからという感じだった。心の弱めな自分にはありがたかった。

発表会の後、懇親会を経て5日間のインターンは終了した。

〜イベント編〜

業務外であったこととかをつらつら書いていく。すごく手厚いおもてなしを受けていた。

こるとんさん

面白い方でした。

前提知識

  • 僕はこるとんさんと同じ学年(しかも確か理一時代は隣のクラス)で、競プロやる前から彼をTwitter上の有名人として知っていた(顔は知らない)

  • 競プロを始めてから彼が相当な実力者と知り、競プロ有名人の中では一番(密かに)応援している

  • 僕のアカウントは彼からフォロバされてない

正体判明まで

初日、出社すると同じくインターンに参加する学生(Aさん)がいたので話しかけた。彼がRust開発のコースと知った。

僕「Rustは結構普段からやられてるんですか?」

Aさん「いや、実はあまりやったことがなくて...」

ん?やったことないのに参加できるの?インターンって結構スキルマッチとか気にされるイメージだったけど、もしかしてこの人はとんでもなく優秀な人?

フォルシアといえば競プロ界隈では有名な方なので、もしかしたら競プロやってるかも?

僕「やっぱ競プロやってるんですか?」

Aさん「ええ、まあ...」

ん?なんか歯切れ悪いな...あんまり熱心にやってないか、隠したいかのどっちかなのかな。でもやってないならもう少し答えてくれそうだけど。実は競プロ強者?

もし有名人だとしたら誰だろう、と考えているとkort0nさんが思い浮かんだ。そういえば聞いた学部はkort0nさんと同じだし、同じ学年だし、最近Rust云々ってツイートしてたような...

ここまでで確信率40%。


初日の昼は、メンター3人+インターン生3人でランチした。このときに次のような会話がなされた。

メンターさん1「趣味はなんですか?」

僕「競技プログラミングをやってます」

メンターさん1「そうなのか、本当に競プロ人口増えてるね」

メンターさん2「Aさんなんかは、"高み"にいるよね」

Aさん「ええまあ...でも僕より強い人がこの会社にいることを知っているので」

また「ええまあ」かい。というかやっぱ"高み"にいる人なのか。「僕より強い人」というのはtempura_cppさんのことだろうけど、レートを知ってるメンターさんがわざわざ"高み"というからには、自分よりはレートが高い人間なんだろう。一応自分はレート黄色をアピールしてたので、てんぷらさんより低いとなるとAさんは橙相当なのか? なんかどんどんkort0nさんに思えてくる...

ここまでで確信率80%。


昼食後、インターン生3人で休憩ルームにいく。どこかで「あなた、もしかして?」と言い出したかったが、その前にどこかから社員さんがAさんに親しげに話しかけてきた。

社員さん「よう」

Aさん「あ、お久しぶりです」

あれ?社内に知り合いいるんですか?もうこれは競プロの繋がりとしか思えなかった。DDCCとか聞こえたし、社員さんの方はてんぷらさんで確定。そして、てんぷらさんと親しげに話す、今までの情報に合致する人といえばもうこるとんさんしかいないだろ、と確信する。

僕「あの、正体分かっちゃったかもしれない」

こるとんさん「え!?」

ACだった。

メンターさん

自分の担当のメンターさんはなかなか個性的な方だった。というか色々と凄かった。 あんまり書くとアレなので詳細は省くが、「人生の成功者」感が凄すぎた。話も面白かった。

社員さんとランチ

これは一番すごいと思った。5日間のランチの予定が全てスケジュールされていた。近隣のお店に社員さんが連れて行ってくれて、昼食代は会社から出してくれた。 一緒にいく社員さんは毎回チェンジされ基本初対面だったが、すごく気を使ってくださり、楽しく食事できた。

話題としては、

  • メンターさんなど、社員の話
  • インターン課題の話(大体励ましてもらってた気が)
  • 大学の研究の話
  • 働き方の話
  • 会社の雰囲気の話

などなど、色々話した。楽しかった。

社長ランチ

3日目昼のスケジュールに「社長ランチ」が組み込まれていた。ベンチャーの社長と会うということで、まあ結構緊張していたが、出てきた焼肉弁当がめちゃ美味しかったので緊張は紛れた。 社長さんは実際に話してみると結構愉快な方だった。楽しくお話した。

前々から「質問を準備しておいた方がいいよ」と社員さんに言われていたが、業務に夢中で特に用意してなかった。 ちょっと余白ができたときに適当に「コロナ期間大変でしたか?」と聞くと色々答えてくれた。やっぱ利益を出す方向と社員を守る方向でバランスをとるのが大変だったみたい。まあ経営する側は大変なんでしょう。

食事会

3日目の夜にインターン生3人と社員さん2人で食事に行った。初日以来インターン同期とあまり話せていなかったので、いい機会をいただいた。

話題は否が応でもこるとんさんの話になる。この頃にはもう1人のインターン生(Bさん)も正体に気づいていたらしく、こるとんさんを「クソライターオブザイヤー様」と呼んでいた。

僕「Aさん(こるとんさん)のツイート拝見させてもらってますよ!二色下は...とか好きです笑」

こるとんさん「よく見てるなあ〜!笑」

社員さん「そのネタは何?笑」

こるとんさんがあれは誤解なんだというところまで説明すると、

Bさん「え!?あれってそういうことだったんですか?!」

どうやら誤解が解けたようだ。

その他にも大学の話とかメンターさんの話とか、結構いろんな話をした。この夜は楽しかった。業務の方の進捗が微妙だったなだけに余計に。 この夜に、こるとんさんにフォロバしてもらった。

バーチャルコンテスト

4日目の夜、バーチャルコンテストのお誘いを受けたので参加した。

いつものパソコンじゃないのでスニペットがなかったりデバッグ環境がなかったりしたのでガチで参加はできなさそうだったが、まあ楽しむつもりで。 4問で最後が青diffということで、時間内にはできるでしょ。

f:id:wattaihei1234:20200907204418p:plain

あれ?なんか勝ってしまった。どうやらこるとんさんは誤読してしまったらしい。二色下でも、勝てる!

発表会後

ちょっと自由時間があったので、インターン生3人で競プロの話をした。

僕「どうやったら強くなれますか?」

こるとんさん「問題を解きましょう」

はい.............

懇親会

最終日の夜、懇親会があった。もはや何を話していたとかはよく覚えていないが、インターンの振り返りとかをしていたのかな。 コロナ対策ということで、5人くらいのグループに分かれた。なのでここではあまりインターン同期と話せなかったけど、まあしょうがないか。 初めて話す社員さんもいたが、楽しくお話できた。

その他感想

  • 優秀な社員さんが多いせいか、ベンチャーなのにかなり落ち着いているな、という印象を受けた。この前にベンチャーインターンに行っていたので余計にそう感じた。
  • とにかく段取りがしっかり組まれていた。ランチだけでなく、初日の行動や席配置まで非常に綿密に計画されたものだと思う。「仕事できる人」が企画した感じだった。運営チームさんありがとう。
  • 社員さんがみんな優しかった。とても居心地がよかった。
  • 実際に出社できてよかった。やっぱ会社の雰囲気とかは実際に働いている現場を見ないとなんともいえないし。こるとんさん含めいろんな人と話せたのが一番の収穫かもしれない。
  • 競プロはやはり1つの文化として定着しているようだった。バチャコン後に感想戦もやった。楽しかった。

とにかくすごいおもてなしを受けました。ありがとうございました。