Googleに入社して1年が経った

記念すべき令和元年*1第一弾の記事は単なる個人的な経過報告である.

自分がGoogleに入社した詳しい経緯は過去の記事を読んで頂ければよいが,ひとまずざっくり言うと研究関係のインターンを2回やって内定を貰ったということになる. 先日の社員によるブログ祭り*2の記事群を眺めても思いの外インターン関連の話題が少なかったので,自分の記事が何かの役に立てば良いと思う. 個人的な感想だが,インターンは相応に長時間の作業になるので,じっくりやり込んで成果を出すタイプの人は一発勝負の採用試験よりも遥かに適性があると思われる. そこそこの給料も出るし,成果は論文にできたりもするので,自分の興味のある内容で募集があれば是非応募してみてほしい*3

入社後に自分が何に取り組んでいたのかだが,基本的にはニューラル翻訳モデルを弄って遊んでいた. などと言ってしまうと身も蓋もないのでもう少し説明を加えると, 文脈情報,特に文書間の照応や具体的な注釈などをどのように機械翻訳に応用するかについて,あれこれ調べたり試したりしていた. 昨今の改良で機械翻訳の生み出す文の表面的な出来が非常に「宜しく」なったため,以前にも増して翻訳結果の具体的な構成要素の間違いが目に付くようになったのは皆さんも知る通りであり, これをどうにかするのが目下の課題となっているわけである.というか,機械翻訳業界そのものが世界的にこのような風潮であり, 最近手元に回ってくる論文はやはり似たような題材を扱うものが非常に多い*4. どれも大してうまく行っていないように見えるので,ここらへんが純粋なニューラル翻訳の限界点なのかもしれない. ひとまず弊チームに関しては,チームを統括しているマネジャーがAMTAという学会でスピーチ(PDF)していたり, メディアのインタビューを受けていたりするので, それらを参考にして頂ければよいと思われる.

ちなみに,この過程で国際会議に出ていたモデルを実装して試したりもしているが,大体うまくいかない.モデルのランダムネスが強すぎて現実的な有用性がないのである. ろくに効果量も調べずにいい加減な論文を発表するのはやめて頂きたいものである.

話は変わるが,前年のうちに色々な機関から研究員や助教(どちらもパーマネント)の相談を受けており, 年末頃,具体的には前回の記事を書いた時期には真剣にアカデミアに戻ることを考えていた. 入社1年未満というタイミングの悪さもあって結局全て断ってしまったが*5, その最も大きな要因としては,やはり現実的な判断基準で比較したとき,人的資源,物的資源,直接的な資金,どれを取っても現職と研究機関では埋め難い差が生じてしまっているという事実がある. 資金面は国もその気になればポンと出せるようだが*6,人的・物的側面は一朝一夕でどうにかなるものではないので,何年か様子を見た方がよさそうである. あまりにも酷い有様が続くようであれば海外も視野に入れる必要があるが,その場合はもう少し真面目に英会話ができるようになる必要がありそうである.

*1:エイプリルフール要素はこの部分だけである.

*2:ネット上では色々疑って掛かられているように見受けられるが,これ自体は別に企画でも何でもなく,単にノリのよい社員によって自然発生したものである.自分に至っては2年前の記事を掘り返したに過ぎない.

*3:とはいえ,インターン内容が極度に研究寄りで一般的に通用する類の話ではないような気もしたので,もう少し他の経験者にも情報提供して頂きたいところではある.

*4:はっきり言って,論文を読まされる側としてこれほどつまらないことはない.

*5:結論を出すのに半年も伸ばしてしまった話もあって非常に申し訳ないが,それだけ惜しいポジションだったということでもある.なお助教の話が来たときに「学位持ってないんですよ」と言ったところ,先方の目が点になった.

*6:言うまでもなくムーンショットなんとかへの皮肉である.そんなギャンブルに貴重な資金を溶かすのではなく,全額を大学の間接経費の充当に回してくれた方がよほど効果があると思われる.

N??TからG????eに転職した

巷で某Nで始まりTで終わる会社からGoogleへ転職した話が話題だが,何を隠そう自分もNで始まりTで終わる組織から同社へ(4月に)転職した身である. ちなみに前職に所属している最中は,近場にあるNで始まりTで終わる大学の博士課程学生でもあった.また前職事務所の徒歩圏内にはこれまたN某Tの研究所があり,この3者が全て自然言語処理の研究をしているのだから傍目にもややこしい.

転職に関して面白い話は特に何もなく,元々前職は1年契約であり(更改は可能),そもそも入所前に現職への就職が決まっていたので,むしろ前職の方がイレギュラーであったと言った方が正確である. 前職は良い職場であり,お役所系特有の煩雑さは稍あるものの,全体的に研究者や開発者がほぼ自由に活動できる職場であった.具体的には,半分思い付きでC++の深層学習ツールを書いてサッと公開できる程度の自由度は確保されていた. 自然言語処理の研究がしたい学生で我こそはと思う方は是非選択肢に入れてほしい.

大学・国立研・企業にそれぞれ短期間所属した身としては,研究活動の自由度の面では,やはり大学や国立研に軍配が上がると思われる.行き先の組織によっても大きく変わるだろうし,このあたりは進路を選択する上でよく勘案した方が良いだろう.

はてなダイアリーからブログに移転しました.

学振特別研究員をやめて国の研究施設に就職した

前回「あと15回くらい書いたら寿命」と言った手前、記事を投稿してしまうと早死にするのではないかと若干訝っているのだが、それはともかく。



今回もタイトルの通り。今日は3/32であって4/1ではなく、そのためジョークでもない。

元々DC1を持っていて、博士2年目までは学振からの援助に頼って生きていたが、今回晴れて情報通信研究機構に有期職を得ることとなった。学振DCは他所からの給与所得を許さないので、こちらは3月いっぱいで辞退である。

事の発端は前回と同じく中の人との会話である。いろいろあって機械翻訳関係の人材を拡充したいらしく、去年の暮れ頃に公募があったため、渡る船に何とか乗った形である。

学振の奨励金20万は世間的には色々言われている金額ではあるが、自分は基本的に田舎の独身なので、この金額で問題なく2年間過ごすことができた。元々学振に通らなければ博士課程に進むつもりもなかったので、この点では感謝である。博士課程の諸氏には是非とも田舎の独身になって節約生活を送ることを強く推奨しない。

やはり行動・資金面で色々な制約に当たったのは辛かったのと、今度の職場の提示額が奨励金と科研費を足してもお釣りが来る程度(しかも給与なので使途自由)であったので、他に選択肢がなかったというのも理由である。

あと計算資源。研究室の環境よりは多く使えるらしい。



ところで、ちょうど数時間前に自然言語処理のトップ会議であるACLの採否が出て、自分の論文が1本再録されたようである。この会議には毎年主著で1本ずつ出しているが、今のところ戦績は3/4である。

今回の話は言語処理学会年次大会で話した内容の増補版なので、気になる方はそちらを参照のこと。ざっくり言うと、ある機械翻訳のモデルを対数サイズに圧縮しますよ、という話である。

今年の会場はバンクーバーらしいが、旅費を工面する目処がない。どうしよう。
あと、英語を話したくない。どうしよう。



なお、前回の記事は2018年度の話であり、本件とはあまり関係がない。



追記:投稿日時が3/31になっているが、投稿したのは3/32になって1時間程度経過したタイミングなのでそういうことにしておいてほしい。もしくははてなのジョークだろうか。

G社に内定した

前回の更新は4年前らしい。あと15回くらい記事を書いたら寿命だろうか?


さて、表題の通り。世の中何が起こるか分からないものである。

自分はインターン経由の採用である。詳しく書けない部分はあるが、簡単に経緯をまとめようと思う。


ことの始めは2015年3月の言語処理学会で、会場の隅で@taku910さんと個人的に話していた折、「うちでインターンやらないんですか」という誘いを受けた。4月から博士課程で、学振との兼ね合いもあり、この時はあまり企業でインターンをすることは考えていなかったので、頭の片隅に情報だけ残していた。

それから3か月ほど国際会議やら何やらで忙しく、上の会話はほとんど忘れていたのだが、一段落した6月頃にふと思い出し、ものは試しで応募してみようと考えたわけである。
が、この年度のインターンの募集はすでに締め切っており、正規のサイトからは直接応募できなくなってしまっていた。これは勿体無いことをした、と思ったが、何とかねじ込んで貰えないかメールで交渉してみたところ、なんと好意で面接枠を用意して貰えた。頼んでみるものである。

面接は合計3回受けた。人によって回数は変わるらしいが、自分の場合、1回目の面接は自分でもちょっと出来が良くないと思ったので、3回というのは多目じゃないだろうか。ちなみに「日本語を強く希望します」と事前に通知していたので、3回すべて日本語で行われた。海外のオフィスを志望しないのであれば、無理に英語で挑戦する必要はないかもしれない。コーディングの実技に関しては、ある程度競技プログラミングの経験があれば心配はなさそうだ、という感想。一般的なソフトウェア開発の知識は必須である。

配属先は先方から通知されるのだが、自分は大学で機械翻訳の研究をしているので、それと関係のあるチーム以外には行かない、と宣言していた。このお陰か配属はほとんど一瞬で決まり、3か月ほど某翻訳ツールのチームでお世話になることになった。ちなみに研究室の同僚がこの段階でマッチングに失敗して不採用になっているので、この主張は結構重要かもしれない。

割と研究色の強いチームで、自分のタスクも普通に研究活動だった。計算資源が桁違いなのと、食事がタダという点以外は大学の研究室とあまり変わらない感じである。
このときの成果は2016年3月の言語処理学会で発表した。論文はこれで、スライドはこれ

インターンの成績が良ければそのまま採用に進むのだが、自分は他の要件を満たしていなかったので、次年度(つまり今年)もう一度インターンをすることになった。2回目は5月から7月まで滞在していたので、結局、去年と併せて半年弱ほどチームのお世話になっていた計算になる。このときの成果は残念ながら別の研究者に似た手法を発表されてしまったので、今のところ論文にする予定はない。

2回目も成績は良かったらしく、今度はそのまま採用プロセスに進んだ。いくつか書類のやりとりをして現在に至る。


さて、インターンにあたって一番心配だったのは英語なのだが(自分はTOEIC500点ちょっと)、蓋を開けてみればそれほど不利になったわけではなかった。この辺はチームやタスクによると思うので一概には言えないが、自分の場合は普段研究に極振りしている生活がむしろ功を奏した感じはする。
ただ筆記能力はどうしても必要で、実際自分の担当だった人事の方とのメールは全て英語である。インターンの応募時点から今までに100通くらいはやりとりしたと思う。このお陰か、最近はメールを書くにあたって辞書を引く頻度は各段に減った。結局は経験がものを言うようだ。
面接など、基本的にはこちらに都合の良い設定を用意してくれるようなので、希望があればすべて申し出るのが得策だろう。

……もちろん英会話ができなくて良いわけではないので、入社するのであれば学習しなければならない。もどかしい。

ちなみに内定通知は貰っているが、行き先についてはもう少し考えるつもりで、受諾は保留している。
これは先方にも伝えてあり、「ご自身が一番幸せになる進路を選んでください」との返事。これは企業の人事ではなかなか言えない言葉だ。

プログラムが終わってもコマンドプロンプトを閉じないようにする

上の画像,Visual StudioCUIアプリケーションをデバッグ実行したときのもの.
「続行するには...」の部分はVisual Studioが自動的に追加するもので,
プログラムが終わっても勝手にコマンドプロンプトが閉じないようになっています.

何気にありがたい機能だったのだけど,
Visual Studio 2005(だったか)あたりから,これが自動で付与されなくなりました.
割と困った経験のある方も多いのでは?

これ,WindowsのPAUSEコマンドが呼び出されているだけなので,
mainから抜ける直前に

system("pause");

とでも書けば,同様の機能が実現できます.

また「続行するには...」が出るのが鬱陶しいというのであれば,

system("pause > NUL");

とでもして,出力を捨ててしまえばいいでしょう.

ついでに,リリースビルドで停止機能を消してしまいたいなら,

#ifdef _DEBUG
system("pause");
#endif

など書いておけば問題ないでしょうね.

QString::toStdString() のバグ

いきなりですが,次のコードはWindows環境でバグることがあります.

#include <QtCore/QString>
#include <string>
...
{
    ...
    // その1
    QString qtstr(tr("foobar"));
    std::string stdstr;
    stdstr = qtstr.toStdString(); // だめ
    ... // ここでヒープが壊れる
}

{
    ...
    // その2
    QString qtstr(tr("foobar"));
    std::string stdstr = qtstr.toStdString(); // だめ
    ...
} // ここでヒープが壊れる

実行すると,上のコメント部分で「ヒープが壊れています」と言われます.
Windows以外の環境はよく分かりません.

QStringは便利ではあるのですが,別のライブラリと連携しようとするとまず間違いなくstd::stringが必要になるわけで,これの変換が必要になる.
そこでQStringにtoStdString()なる関数が用意されていて,これを使えば楽に変換ができるよ!
……と運びたいところが,単にワナになってしまった,というオチですね.

以下のページでも言及されています(多分近いことをやろうとして悩まれています).

http://d.hatena.ne.jp/kasugano/20120302/1330684684

回避策はこう(上記ページからの引用).

#include <QtCore/QString>
#include <string>
...
{
    ...
    QString qtstr(tr("foobar"));
    std::string stdstr(qtstr.toAscii()); // OK
    ...
}

一度QByteArrayにデータを写して,それを引数にstd::stringを作るわけです.

toAscii()でコーデックは大丈夫なのか? と思ってマニュアルを見たら,どうやらQTextCodec::setCodecForCStrings()で指定したコーデックに変換されるようなので,ひとまず問題はなさそう.

QString Class | Qt 4.8

このバグ,英語のフォーラムを眺めても解決は見ていないようで,しばらくは対応されないような気がします.

(ちなみに当方のバージョンは4.8.0です)



……で,結局なぜバグるのか.
確認は面倒なので予想です(無責任ですみません).

ヒープバグが発生する典型的なケースとして「メモリを取得したインスタンス(EXEやDLLのこと)と解放するインスタンスが違う」というのがあります.
たとえばDLL側で取得したメモリを,DLLを呼び出したEXE側で解放しようとするとバグになります.

おそらくこのケースに見事にハマっているのではないか.
つまり,

  1. QString::toStdString() 内部で std::string の一時オブジェクトが生成される.
  2. 一時オブジェクトが戻り値としてQtCore*.dllから出てくる.
  3. いらなくなった時点で一時オブジェクトは破棄されるが,破棄するインスタンスがQtCore*.dllではないのでバグになる.

こういうこと.
サンプルその1では,operator =の実行が終わる時点で一時オブジェクトが破棄されるので,行を抜けるとエラー.
サンプルその2はコピーコンストラクタですが,この場合最適化で一時オブジェクトがそのままこちらのオブジェクトとなるので,スコープが終わる時点で破棄→エラーとなるわけです.

Qtを静的リンクしてインスタンスを同じにしてしまえば問題は起こらないような気がしますが,それはそれで(LGPL版が使えなくなるので)不便.

ううむ.



そういえば上の記事では「QString::toLatin1()でヒープバグが出た」的なことが書いてあるのですが,当方の環境では出ませんでした.
というより,toAscii()もtoLatin1()もQByteArrayを返すので,どちらか一方がおかしいというのは考え難いのですが……何か違う原因でしょうか.

qtmain.libの謎

QtでWindowsGUIアプリケーションを作ってて疑問に思ったことがひとつ.

Qtはmainから処理を開始するのですが,WindowsGUI開発するときのエントリポイントといえばWinMainです.

エントリポイントが標準じゃないせいで移植性の問題が発生するんですが,QtはWinMainをqtmain.libというスタティックライブラリ(デバッグビルドではqtmaind.lib)に隠蔽して,表面上はmainから処理しているように見せています.

ところが,ここで問題がひとつ.

もしLGPL版のQtを使ってクローズドで開発しているとして,スタティックであるqtmain.libをリンクしてしまったらLGPL的にアウトじゃないでしょうか.

そう思って公式を見たら,案の定説明されていました.


The qtmain Library - Qt Developer Network


どうやら,qtmain.lib(の中のコード)に関してはGPLLGPL,QtCLは適用されず,BSDライセンスが適用されるみたいです.

ということはクローズドなソフトウェアでもqtmain.libは組み込んじゃってOK! ということなんでしょうね.