先日、ビット量子化の手法でBitNetの論文がでてSNSで話題になりました。私も気になったので論文(とその参照論文)を1時間ほど確認して自分なりの要約をツイートしたところ、結構多くのリツイートやいいねをもらいました。
bitnetの論文気になるとこだけ読んだ。
— Masayuki Isobe (@chiral) 2024年2月28日
・二値じゃなく三値(±1と0)なので1.58ビット
・そのビットで演算するのは積和演算部のみで活性化関数は8ビット(256階調でしきい値で3値化)
・学習も推論もちゃんと1.58ビットでやる
・ゼロWeightが特徴量選択として機能
専用ハード化可能なパート小さそう…
僕みたいなソフトウェアエンジニア職ではあるけどプロの研究者ではない人が最新の技術や論文を読む際に、「気になるところだけに絞って読む」ことが出来ると都合が良いです。
それについて人それぞれ色んなやり方あると思いますが、本エントリでは私の読み方を説明し、それに基づいた具体的な論文読み例を書いてみます。
その論文から得たいことを明確にする
論文には概要(アブストラクト)が付いているので、まずそれを読んで「その論文から得たいこと」を明確にします。アブストラクトに加えて、本文の最後の結論(コンクルージョン)も併せて確認すると良いこともあります。
例えば、BitNetの論文でしたら、
- どの部分をビットで計算してるのか?DNNモデル全体か?それとも一部か?
- 4bitや8bit量子化と比べて何が優り何が劣るのか?性能的に完全に上位互換なのか?
- 蒸留(学習時は普通の数値を使い、学習済みモデルをbitに変換する)と比べて(以下同様)
が私にとって「気になること」でした。なので「これらの問いの答えを論文の中から探す」という読み方をすることになります。
しかしそれだと、もし仮に論文の中でこれらの問い以外の重要なことが書かれていてもそれに気づけない可能性はあります。そうだとしても、割り切ってそれを諦めるのが重要です。そもそも、論文の内容をくまなく読もうとしたら短時間で読むのは(その分野のプロの研究者とかじゃない限り)困難だと思います。
「問い」の答えになりうる「自分の仮説」をでっち上げる
前節で述べたとおり、論文から得たいことを「問い」のリストとして明確にしました。そうしたら早速本文の確認に入る、、、のは得策ではないと私は思っています。
その前に各「問い」の「答え」が「論文中にどのように書かれているだろうか?」というのを考えます。そして「こういう答えが書かれているのではないか?」という仮説を自分なりにでっち上げます。
例えば、BitNetの論文でしたら、以下のとおりです。
- 「どの部分がビット計算か?」および「蒸留と比べてどうか?」についての仮説
学習フェーズと推論フェーズでいうと、既に蒸留という手法があるから推論フェーズだけでビット計算するというのではインパクトが薄そう。NVIDIAのハードは特に学習時に掛かる大量の計算負荷をさばけるという点で市場で圧倒的優位に立っていて、この論文はマイクロソフト系の研究室のものだからそれに対抗する技術開発のはずで、だから特に学習時の計算を軽くする話に違いない。
DNNのモデル全体をビットでやるものかどうかはよくわからない。積和演算と活性化関数の全てをビットでやるとしたら、それは決定的な論理回路になってしまってAI的ではない気もするから一部だけビットでやるという話かもしれない。でも全てをビットで計算しながらAI的な振る舞いを可能にする手法なのかもしれない、そこは注意してみよう。
- 「4bitや8bit量子化と比べてどうか?」についての仮説
素朴に考えれば、ビット数の少なさとモデルの性能は原理的にトレードオフの関係にあるはず。その原理を打ち破る性質があるとしたらどんなものだろう?情報が少ないほうが過学習を避けて汎化能力があがるドロップアウト正則化みたいな話と関連してるのだろうか? しかしそれだと逆にバイアスが掛かりにくくて学習が進みにくそう。モデルの表現力を維持しつつ少ビット化による正則化の効果が相まって性能があがりましたという話になりそうだ。だから、特にビット計算でありながら表現力を維持するためのキーポイントが何かという点が問題であり、そこに注目して読む必要がありそう。例えば最終レイヤは通常ビット数のDenseネットがあるとか、あるいは活性化関数はビット演算じゃないとか?だろうか。
このように、仮説を立てると論文に対する読みが「オープンクエスチョン」ではなく「クローズドクエスチョン」になります。友人と食事にいくときに「今日何食べたい?」って聞くよりも「今日カレー食べたくない?」って聞いたほうがお店が決まるまでスムーズであることが多いのと同じです。また、仮説を立てることによって、たとえ仮説が外れた時に「仮説とどう違っていたのか」という情報が読みに加わり、同じ時間で論文を読んだときに得られる情報が増えます。「カレーは今日はいいかなぁ」「どうして?」「もう少しさっぱりしたものが食べたい」という風に、「カレーに対する反論としての情報」が得られるわけです。
仮説を立てにくい時
前節で、仮説を立てるのが大事、と書きましたが土地勘がない分野の論文の場合、その仮説を立てようにも糸口すらみえないこともあると思います。そういうときは「ガード下の居酒屋で飲んでるおっちゃんとの対話」法という方法を僕はよく使います。
これは、めちゃくちゃ素人の相手、すなわち話を聞いた範囲だけから率直にツッコミや感想を述べる相手を論文読みの相談相手として想像するという方法です。「飲んでるおっちゃん」はいわばそのモデル像です。
BitNetの論文の例でやってみましょう。
(Q) 最近流行りのAIで、深層学習っていうのがあって、いわば脳みそを真似た仕組みなんですけど、脳みその中の神経回路って電気信号で動いてるんで何ボルトみたいな電圧の高いところ電圧の低いところという感じで電圧の計算をしてるんです。 電圧って3.5ボルトみたいな小数点以下の微妙な数もちゃんと加味しないと正確な計算ができないから、脳の仕組みを真似しようとしたら小数点の計算をしないといけないんですけど、最近、少数じゃなくて整数、それも0から255までの数で計算するという方法が出てきて、少数の計算よりもコンピュータの回路が小さくて済むのでお得だということで注目されてるんです。
(A おっちゃん). それは、255だったら2.55ボルトってことにすれば少数と同じじゃねーの?
(Q) そうなんですけど、本当の脳みその神経は厳密に3.1415926535ボルトとかあるわけで、それを少数2桁にちょんぎってしまうという方法がAI研究の世界で流行ってるって話なんですよ。
(A) ふーん. で、君は今日オレに何を聞きたいわけ?
(Q) で、今日僕が読もうと思ってる論文、0から255じゃなくて「0か1」という極端な方法でも結構上手く行くよ!っていう方法らしいんです。結構中身が難しいので読む前に中身を想像してから読もうと思って話し相手になってもらいたくて。
(A) 0か1ってスイッチみたいなものか。電気つけるつけない、ってことかな。それじゃ、スイッチとAIは何が違うのよ?
(Q) えーと、コンピュータの集積回路はスイッチの集まりなんですけど今のAIはスイッチだけじゃなくて、学習が出来るためにはパラメータの勾配を計算する仕組みがあって、、ってあれ?「パラメータがビット表現なのか計算結果がビット表現なのか」というのはビット量子化においてどういう分類になるんだろう?…。それと、もしスイッチの仕組みだけでAIやるとしたら…決定木みたいな感じしか思いつかないな…。
(A) 何言ってるか全然わかんねーよ。簡単に説明しろ。
(Q) あ、、すみません。でも、話し相手になってもらって結構自分なりに掘り下げることが出来たんで、家に帰ってその論文読もうと思います。あ、これ、飲み代です。
(A) お、サンキュー!
みたいな感じです。(ふざけてるように思われるかもしれませんが、「最先端の論文を素人目線で考える」のはめちゃくちゃ大事なことだと思ってます。何事も「本質的な理解は常に素人目線に帰着する」って僕は信じています。
本文も2段階読み「目星を付ける→入念に理解する」
さて、仮説を何らか立てたので、本文を確認する準備ができました。本文を確認しましょう。
ここでのコツは、「読むべき箇所をピックアップする」と「実際にその箇所を読む」とで2段階でやるということです。「目星を付けてから読みに入る」ということです。
具体的にはまず本文を上から下までざーっと眺めたり拾い見たりしつつ「自分なりに立てた仮説に関係ありそうなところ」をピックアップします。繰り返しになりますが「論文を読んで」はいけません。でも「読まなくても目に入って分かってしまった」というときもあり、それはそれで良いです。
そうやって目星をつけて大体全体見たかな、と思ったらピックアップした箇所とその周辺を入念に読み込みます。そこで書いてあることが、その論文の別の箇所や、ときには別の論文(特に、同じ著者による従前の研究)を参照しているケースもあります。どうしてもそれを参照しないと明確に分からなそうだと思ったら、それもちゃんと参照しに行きます。参照論文の読みに移る際も「いま何を読もうとしてるのか」を明確にし、目星を付けてから読むという風に徹底します。けっして上から下まで全部を読み込んではいけません。
そうやって読んでいくと、最初に目星をつけたところが大体読めてきます。それで、当初の目的である「問いのリスト」が消化できたら、それで論文を読み終えたことにして、自分なりに問に対する答えをまとめて終わり、ですし、「新たな問い」や「新たな仮説」が浮かんできたら引き続き論文を同様の方法で読んでいくことになります。
というわけで
論文読みに関する自分なりの方法を書いてみました。 実際に、BitNetの論文はこのような方法で1時間ほどで読みました(なのでもしかしたら読んだ結果の私の理解は厳密には正しくないかもしれませんが、少なくとも自分にとって得るものはありました)。
特にポイントとなるのは、「仮説を立てる」部分で、仮説の巧拙は「もともと自分が持っている知識の幅や量」に依存していることも分かります。なので、最先端の技術確認と同じく既存の知識を体系的に理解(それは論文ではなく書籍であることが多いでしょう)することも大事でしょう。
ではまた!