Joeの精進記録

旧:競プロ練習記録

卒論の行方

これは自分が学部生のときに気になっていたことなので紹介します。卒論が人生初論文になりそうな人を想定します。 時系列を追って書いていこうかなと思います。後半は経験していないので理解している範囲で想像で書いてます

卒論テーマを決める

これがだいぶ大変なのですが、先行研究を調べたりして、おもしろそうだなあと思ったやつを読んでみたりします。 基本学部のときは知識が全然足りないのでどれも研究するとかいうレベルじゃねえ!wとなりますが、まあ気合で乗り切ります。

卒論を書く

まあうちは英語で書くので英語が苦手な人はつらそうでした。5000 words以上の指定があるので結構長いです。卒論は学部時代に勉強した成果物、という体裁があるのでintroductionやrelated workをやたら長く書くスタイルになります。謝辞も先生たちマジでありがとうみたいなことを書くスタイルが多い気がします

卒論発表

これ、緊張しないと思ってた割にガチガチに緊張しました

卒論を学会にだす準備をする

卒業後就職する人は春休みにパパっとまとめて小さめのところにとりあえず出してみる、などをやっている人もいました。 まずどの学会に出すか決めて、手直しをします。内容はそのままっぽい人も多いですが、研究の続きをしてより高度な内容にする人が多数派だと思います。

文章を直す

学会には学会指定のLaTeXフォーマットがあったりします。また、卒論は前述したとおりintro部分がやたら長いんですが、学会だとページ数指定などがあり本質情報部分を厚くしたいので文章を削ります。

提出する

多分abstの締切とfull paperの締切が別にあると思うんですが、卒論提出と同様にwebからsubmitします。締切直前の30分とかは本当に混雑します

arXivに投稿する

分野によると思いますが、arXivに論文をあげます。が、まあ学会と同じフォーマットで提出すると、査読のblind性に反するのでフォーマットを多少変更します。ここでいうフォーマットはTeXのスタイルのことです。

rebuttal

自分が提出した論文を複数人に査読されて、レビューが来ます。多分ジャーナルに投稿する場合は何度も担当者とやりとりを往復させると思うんですが、学会の場合は1往復しかしないことが多いかと思います。複数人の査読者に、返信をするわけですが、文字数制限がだいぶ少ないので、複数人に責め立てられると大変みたいです

結果

いわゆる論文が通ったかどうかはこのタイミングでわかります。学会にもよりますが、提出から数ヶ月かかります。通ったやつはarXivの論文を学会仕様でupdateしたりするみたいです。

学会出席

出席したいね

pytorchのワナtop 3

研究でpytorchを初めて使ったんですが、いろいろつまづきました。3つ紹介します。top 3と書きましたがtopじゃないかもしれません

torchのtensorのサイズはintではなくtorch.Size型

まあ基本中の基本なので知ってる人は多いと思いますが、arr.size() == 1とかやっても永遠にFalseになるので注意です。

torch.tensorとtorch.Tensorは違う

torch.tensorは引数のオブジェクトの型に合わせたtensorを作りますが、TensorはFloatTensorのエイリアスで、float32型のオブジェクトになります。案外Tensorの方が便利

torchのstdとnumpyのstdは違う

配列の標準偏差を求めるときに arr.std() としますが、torchの場合は配列の要素をサンプルとしたときの、真の分布の標準偏差の不偏推定量を返します。つまり、分散を求めるときに nではなく n-1で割ります。とくに1要素の配列のstdはtorchの場合nanになるので注意です。分散についても同様です。ちなみにarr.std(ddof=1)とすると、numpyの場合と同じ結果が返ります

論文もうちょい頑張るか〜

朝起きたらzshが死んでいた話

起きました。さーて研究研究といいながらvscodeを開いてターミナル実行しようとしたら一瞬でターミナルが落ちます。

このままじゃエラーメッセージすら読めないので一瞬のすきを突いてスクショをしてみると

f:id:xuzijian629:20190516111115p:plain

なにこれ!?!?!?!?

検索されやすいようにエラーメッセージ書いときます

dyld: Library not loaded: /usr/local/opt/gdbm/lib/libgdbm.4.dylib
  Referenced from: /usr/local/bin/zsh
  Reason: image not found

ググると優秀な記事が見つかります。

qiita.com

とりあえず以下のコマンドを実行すればいいらしいのですが

$ brew reinstall zsh && brew unlink zsh && brew link zsh

zshが立ち上がらないので当然コマンドを実行できません(もちろんvscodeからだけではなくターミナルから起動することもできません)。

Finderからbash起動できないかな、、、とか思いましたけどまあさすがにできなそうだし、これ完全に詰みでは、、、と思ったのですが

Macにはautomatorとかいうアプリケーションが最初から入っており、これを使うことで解決できました(初めて存在を知った)

f:id:xuzijian629:20190516111530p:plain

まあこんな感じでApplication -> Run Shell Scriptという手順で、shell scriptを実行できます。しかも実行時シェルを指定できるので、zshではなくbashから呼び出すことができ、無事zshのreinstallに成功しました。

難易度高すぎないか

機械学習を勉強しようと思っている人へ

またポエム記事です。お付き合いください。

最近、ちょっとはマシになったとはいえ、まだまだ機械学習の人気は絶えません。 本屋に行けば機械学習の本は相変わらずたくさんありますし、Qiitaの機械学習の記事も増え続けています。

ぼくは、競争的な分野がすきだったので軽い気持ちで機械学習を専攻しましたが、どうしてこんなにも 機械学習を勉強したがる人が多いのか理解に苦しむことがよくあります。

機械学習を勉強すると言っても、基礎研究をするのと、自分で何かに応用するためにライブラリなどを使えるようになるのでは天と地ほど状況が違うと思いますが、ぼくは前者をやっている立場なのでそれ視点で記事を書きます。まあ正直機械学習機械学習言っている人の9割以上は後者だと思うんですが、後者につられて曖昧な判断で前者に入ってこようとしている人にもう一度考え直す機会を与えることができたらいいなという感じです。

そういえば弊学の情報科学科もカリキュラムが変わって機械学習系が増えるみたいですね。

さて、ぼくが機械学習をやっていて気になることは、研究や理論を勉強して、「うわ〜〜〜〜〜、これ天才すぎる!!!!!いやーーーーー、これ天才すぎるだろ!!!!!」と感じることがほとんどないという点です。いやすこしはあるんですけどね、さすがに。これはどうしてかというと、正直機械学習における数学は、離散数学など数学分野の研究で必要とされるものよりずいぶん簡単です。理論が深くないというと怒られそうですが、 大抵の論文でも、革新的な数式というのは本当に1つぐらいしかなく、しばしばそれも非常に初等的で、「こんな内容で論文になるのか」と思うことさえあります。 個人的な感想ですが、経済学と近い点がある気がします。いろんな現実世界的な問題設定を考えて、定義や用語もめちゃくちゃ多いです。しかも、それらを勉強しているうち(教科書を読んでいるうち)は95%ぐらいに関しては「いやそれはそうだろ、なんでこんなhogeみたいなことを永遠を説明しているんだ。もっと非自明で面白い定理はないのか」という気分になります。

情報科学を専攻する人の多くは、情報"科学"がすき、ロジックや数学がすきな人が多いと思っています。ぼくもそうですが、機械学習の分野が数学系の分野と もっとも異なる点は、ヒューリスティクスを扱う分野だということな気がします。機械学習は、限られたデータ量・もしくは計算資源・もしくは現実の時間でいかにうまく学習するかという 問題に関してずっと研究がなされてきているわけですが、やはりこれだけ研究者がいて、たくさんの論文が出てくると、先行研究よりも良い結果を出そうとすると、最適化アルゴリズムやネットワークの構造がどんどん複雑になってしまいます。そうなってくるとヒューリスティクス的な話が非常に多くなってきて、それは真に計算量を良くするわけではないのに、実験結果が良い、という理由でもてはやされたりします。ハイパーパラメータの調整とか本当にバカらしくなってしまいます(個人の感想です)。機械学習はあらゆる情報系の分野でもトップクラスに「世間の役に立つ」分野だと思います。それはおそらく多くの研究者にとって機械学習に携わっている自負にもつながっていると思います。しかし、科学的な面白さ・美しさを追求する視点から見ると、近年の機械学習はあまりに実験主義に偏りすぎている気もしていて、理論が美しいかと言われると全然そうは思いません。

ちょっと機械学習をdisってしまいましたが、機械学習分野にも面白い論文はたくさんあります。個人的にすきなのは、ネットワークの性能の下限・上限を証明するような論文がすきです。こういった論文はけっこう数学で、ヒューリスティクスでごちゃごちゃした手法などを包括して一蹴りできるので爽快ですね。まあこういった論文は主要な国際会議にはそれなりに見られるので、こういった論文が出続ける限り、まあまあ機械学習は楽しんで専攻できるかなという気がします。まあしかし卒論のときに教授にも言われましたが、やはり学会にはその時その時のはやりがあるようで、すごい非自明な事実を証明した論文とかでも時代錯誤すぎる内容だと、そのまま学会には出さず、何かしら現代的な技術に織り交ぜて応用として出したほうが通りやすい、などがあり、研究は社会とつながっているなと痛感せざるをえません。

まあぼくが機械学習についてこんな愚痴を言っているのは機械学習を専攻していて他の分野の学会を詳しく知らないだけ、というのもありそうです。研究のはやりみたいな話はさすがにどの分野の学会にもあると思いますし、この記事だけを参考に考え方を変えるのはやや危険だと思いますが、一人の修士生の意見として参考にしてみてください。

追記

そういえばぼくの機械学習研究のモチベーションを紹介していませんでした。ぼくのモチベーションは機械学習を速くすることです。いまどういう論文でも実験を数日間回したりしているのが普通だと思うんですが、なんかバカらしくなってしまいます。ぼくはせっかちなので30分待つだけでもいやなんですが、いまのSOTAに匹敵するような、ずっと速いアルゴリズムやネットワークを構築してみたいなと思っています。それでは

ポエム: 専門の分野をもつということ

最近けんきう+競プロで忙しいんですが、こういうとき却ってブログ書きたくなりますね。

なんか専門の分野があるってかっこいいなという話です。

ぼくは東京大学の理学部情報科学科出身ですが、多分他大学や他学科の情報系とは一線を画する雰囲気があると思います。

それは、口を開けばイケイケweb技術で○○を作りたい!とか、ブロックチェーンで○○したい!とか機械学習で○○!とか言っている人がほぼ皆無、だという点です。

みんな自分がすきな分野のプロになるぞ!という意識をもってやっている気がします(少なくとも院進して、よく大学に来ているメンバーは)

最近、ツイッターでJoeさんはデータ構造もwebもサーバーも競プロも機械学習もできてすごいですね、みたいなことを言われました。これは素直にうれしいんですが、なんかこういうのを他人に目指してほしいかと言われるとそうではないです。ぼく視点では、いろんなことがある程度できる人よりも一分野が圧倒的にできる人のほうがかっこいいですし、その人自身、それをやっていて楽しいだろうなと思います。

これは学科の紹介になりますが、うちの学科の人は多分だいぶ興味の志向が狭くて、たとえばアルゴリズムが好きな人は、機械学習の講義とか絶対取らない!みたいな感じですし、UI系の研究室の人に競プロ誘っても、絶対やらない!みたいな感じの人が多いです。

まあ幅広い分野に興味がある人は就職とかには強いと思います(まあ実際ぼくはは情報系のコーディング試験+面接に落ちたことがないのでだいぶ強いです)。しかし、ある一分野が圧倒的にできる人(うちの学科/専攻で見ているレベルを想定しますが)が仕事に困るとか聞いたこともないですし、というかそもそも彼ら自信別に仕事とかそんなことをいちいち考えながら研究していないと思います。その分野が好きで、自発的に勉強して、トップ付近にいるんだと思っています。

まあこういうのを見てきた背景もあって、ぼく視点だと、複数の分野に力を入れるのはある種自分のアイデンティを保つための逃げだとも思っていますが、まあでもそれのおかげでアイデンティが保たれているところはありますし、いろんな界隈の人と仲良くなれて刺激も受けるので、まあそこまで悪くもなかったかなと思っています。

圧倒的な実力と興味があって最前線を進む人はかっこいいなという話でした。

JAG 国内模擬 2015 練習記

前回はこちら

xuzijian629.hatenablog.com

結果

vjudge.net

A, B

ぼくがすぐに書いた。AはFA相当っぽい。ABのペナも最小?さすがに仕事をした。

D

Cの実装が詰まっているようで、1時間50分ぐらいかかってDを荻野が通した。ややバグに見舞われたみたいだけど 多分実装量を考えるとだいぶ早くミスに気づいたほうなんじゃないかな。ぼくとしては大変満足

E

Dを通して5分後ぐらいにEのデバッグが完了してEが通る。グローバル変数を各ケースごとに初期化するんだけど初期化する位置が間違っていた。 やっぱりローカル変数を使うべき

良かった点

A, Bを早く通せてペナを抑えられたのは良かった。通した問題に関してはノーペナだったのはえらい。

改善点

  • さすがにfunction<void(int, int)>みたいなやつそこまで遅くないので、グローバル変数は本当に使わないほうがよさそう。
  • 序盤の問題の実装を待ち時間に詰めるのは本当に大事。queueが溜まりやすいので、解法が一瞬で浮かんでもめんどそうなところを事前に書き出したり擬似コードをメモしておくのは本当に重要。queueを詰まらせない!!!
  • 制約が小さい問題はシミュレーションを愚直に実装するのが楽。たとえば、各ターンごとの動きをvector<vector<int>>を書き換えるのではなく新しいvector<vector<int>>を生成するほうが楽だったりするし、デバッグもしやすい。定数倍高速化とかメモリとか考えるのは二の次。そもそも実装が重いのでいかに楽なコードを書くかが本質

queueに詰まった時点で実装をぼくに回したほうがいいかもしれない。けんしんと荻野にhogeみたいなところで頭を使わせたくない

さいごに

ABDEという組み合わせ、本番じゃ0チームっぽい。さすがに異常すぎた

team Girigiriのライブラリをまとめるサイトを作った

ひさびさにweb系をやったわけですが、苦労(というか無給なのでまじでやりたくない)の割にツイッターの反応が薄くて悲しいのでここでイキリます。。。。。

lib.team-girigiri.com

こちらがそのサイトで、何ができるかというと GitHubのレポジトリの内容を見やすくrenderして表示 します。

f:id:xuzijian629:20190427181943p:plain

もともとライブラリをまとめるページ(ei1333くんみたいなの)は作りたかったんですが毎回メンテナンスするのは面倒なので、レポジトリにpushしたら自動的に更新してくれるようなものを作ろうと思いました。

まあ学科民とかはよく知っていると思いますがもともとゴリゴリのwebエンジニアなのでさすがにこれ程度の実装はやるだけなんですが、さすがに今はなかなか忙しいので、もう1日で書いちゃえ!wという感じで一気にかきあげました(まあいろいろあったので数日かかりましたが)。

f:id:xuzijian629:20190427182252p:plain

詳細ページはこんな感じです。GitHubの対応するディレクトリのreadme.mdにまとめた内容がparseされてここに展開されます。

実装が面倒だったため発生した謎仕様

  • このページはご覧のようにSPAなのでURLが動的に変化します。右下のツイートボタンでツイートできるんですが、twitterの公式scriptを読み込むと、ツイート時のリンクがscriptを読み込んだタイミングのリンクになり、URLが動的に変化した後では、ツイート時のリンクと実際のリンクがずれてしまいます。 まあこれは別にtwitterのやつを読み込み直せばいいのですが、Angularではxss対策としてこういう挙動を許していないので対策しようとするとなかなか面倒です。

  • SPAのOGPも妥協しました。ツイッターに貼ったときのリンク先をbaseのurlに統一しています。SPAこういうとこ面倒ですね

まあこれぐらいですね。これ以外の謎挙動があれば教えてください。

おわり

AWSに10000年ぶりにログインしたら無限円払い続けてたっぽくて人生が厳しい