論文紹介 Improved protein structure prediction using potentials from deep learning

研究室でやった論文紹介のレポートをそのままコピペしました. 今回ご紹介するのはDeepMind謹製AlphaFoldです. CASPで大勝したので割と界隈では盛り上がってたんですかね? モデルの中身はよくあるネットワークです(タンパク質の構造を作るところはいままでにない手法だと思いますが...). 入力の特徴量も取り立てて目新しいものでは無いんですが, 機械学習のテクニックをいくつか導入して大きな改善が得られていることが面白いと思いました.

導入

タンパク質の構造はその機能を大きく左右するため重要である. 一方で,タンパク質の構造を実験的に決定することはコストが大きい. そこで,近年タンパク質の配列から3次元構造を予測する研究が行われている. この論文では,AlphaFoldというアルゴリズムが提案された. 結果として,CASP13においてフリーモデリングの43個のタンパク質のうち24個でTM-Scoreが0.7を超えた.

手法

f:id:hikarukondo:20200720160952p:plain

AlphaFoldの手法

AlphaFoldの概要を図に示す. 入力はマルチプルアライメントや共変異などの特徴量を用いる. AlphaFoldのDeep ResNetネットワークは距離分布とねじれ角の分布を予測する. 距離分布は,2Åから22Åを64段階に区切った離散的な分布である. 学習時に二次構造予測や溶媒露出度予測などのサブタスクを用いてマルチタスク学習を行うことで精度の改善を行っている. また,入力の特徴量をパッチに分けて入力し,data augumentationを行う.

勾配降下法に用いるポテンシャル関数は 残基間の距離,ネットワークがす予測したのねじれ角の分布,立体的な衝突を防ぐRosetta9のscore2_smooth関数の3つからなる(図赤). ポテンシャル関数は,すべてねじれ角によって表すことができ微分可能であるため, ポテンシャルを勾配降下法を適応することでタンパク質の構造を最適化できる(図青).

結果

f:id:hikarukondo:20200720161225p:plain 図左にCASPのT0955の29番目の残基とそれ以外の距離分布を示す. この分布の中で赤いbinが実際の距離である.また,青のヒストグラムは距離が8Å以上,緑が8Å以下を表している. この分布の中で分散が小さい場合はピーク付近に実際の距離があることが多い. また,図中央はCASPのT0990に対して予測の中央値と実際の残基間の距離をプロットした. 予測される距離と実際の距離に強い相関があった. 図右は横軸に予測された分散と縦軸に予測されたモードからの距離を表したグラフである. 分散が大きくなるほど,誤差が大きくなった. 図は,Deep ResNetの出力のbinの数とTM-Scoreの関係を表している. この図の赤の線は回帰を用いて予測した場合のTM-scoreである. 回帰で予測を行った場合と分類問題として予測を行った場合のTM-scoreの差から,Deep ResNetの出力を距離分布にすることの重要性を表している.

f:id:hikarukondo:20200720161310p:plain

まとめ

ついにbio関係にもDeepMindさんがやってきてしまったかと思いましたね. その分野は発展することはいいことだとは思うんですけど... DeepMind恐るべし

論文紹介 OCGAN:One-class Novelty Detection Using GANs with Constrained Latent Representations

この論文を選んだ理由は1つのクラスから異常検知を行えるから.またネットワークが苦手としていることを自分で探しつつ訓練をするアプローチが面白いと感じたから. この論文はCVPR 2019に採択された論文です. これドクターの学生が書いた論文なんですね, アメリカのドクター化物ですね.

PDF

勘違いしているところがあればご指摘いただけたら幸いです.

またスマホ版で見ると文字化けする可能性があるので, PC版で読んでいただくことを推奨します.

概要

  • 異常検知のモデル.
    • 訓練時の入力は1クラスのみで可能.
    • Auto-encoderを使用.
  • この論文での見どころは4つ

    1. 潜在空間に制限を与える.
      encoderの出力に tanh を利用
    2. Discriminatorを潜在変数に使用.
      encoderの出力が一様分布になるように訓練を行う.
    3. 2つめのDiscriminatorを入力空間に使用.
      潜在空間内でどのような入力を受けてもin-classな出力ができるように訓練する.
    4. generate-descent dased sampling techniqueの導入.
      out-of-classを生成するような潜在空間内の点を探索.
      より効果的なDecoderの訓練になる.

Proposed Method : OCGAN

Motivation

in-classが訓練に用いられるクラスつまり異常なしの画像. 一方,out-of-classは異常ありの画像を表す.

Generatorはauto-encoderを用いる. Generatorはどのような入力を受けてもin-classの画像を生成するように訓練を行う. out-of-classな入力でもin-classの画像を出力するため,大きなlossの画像をauto-encoderが出力することができる.

Denoising auto-encoder

GeneratorにはDenoising auto-encoderを用いる. 過学習に強くなる.

損失関数については以下の式で与えられる. $$ l_{MSE}=||x-Decoder(Encoder(x+n))||^2_2 $$ $$ where \ n \sim \mathcal{N}(0,0.2) $$

Latent Discriminator

このDiscriminatorを用いるモチベーションはEncoderの出力が一様分布になるようにすること.

encoderの出力(潜在空間)がの一部しか使われない状況を避けたい. auto-encoderはどんな入力を受けてもin-classの出力をすることがこのモデルの目標である. 訓練時に出現していない潜在変数をDecoderが受けた時in-classな出力をする保証がない. Decoderがなるべく様々な潜在変数で訓練できるよう,encoderの出力の分布が一様分布になるように(encoderを)訓練する. よって潜在変数に対して,Discriminatorを使用する(Latent Discriminator). よって損失関数は $$ l_{latent} = - (\mathbb{E} [\log D_l(s)]+\mathbb{E} [log(1-D_l(Encoder(x+n)))]) $$ $$ where \ s\sim \mathbb{U(-1,1)}, x\sim p_x $$

上記の目的関数を $$ \max(Encoder)\min(D_l)l_{latent} $$ で訓練を行う. 訓練が完全に達成されればencoderの出力は完全に一様分布になる $$ Encoder(x+n) \sim \mathbb{U}(-1,1) $$

Visual Discriminator

Visual DiscriminatorはDecoderにより生成された画像か一様分布から生成されたかin-classの入力から生成されたかどうかを判定する. latent Discriimnatorでencoderの出力が一様分布になるように訓練しているため, Decoderに均一分布の入力がある場合をfakeとして訓練し,実際のEncoderの出力をtrueとして訓練する. 目的関数は以下である.

$$ l_{visual} = - (\mathbb{E}[\log D_v(Decoder(s))]+\mathbb{E}[log(1-D_v(x))]) $$

$$ where \ s \sim \mathbb{U} (-1,1), x\sim p_l $$

この損失関数を以下のように訓練する.

$$ \max(Decoder)\min(D_v)l_{visual} $$

Informative-negative Mining

上記のような手法を用いても潜在空間内でout-of-classを生成してしまうことがあった. f:id:hikarukondo:20200323043356p:plain

つまり上記の訓練手法のみでは潜在空間全てを訓練することができなかったということである. この問題を解決するため,低クオリティの画像を生成する潜在空間を場所を探すアプローチをとった. そしてその領域から生成された画像(クオリティの低い画像つまりout-of-classのような画像上の図でハイライトになっている部分)をinoformative-negativeなサンプルと呼ぶ. Informative-negativeなサンプルを探すため,潜在空間に対して勾配効果方を用いる. Informative-negativeを生成してまう潜在空間を探すためにnetworkのパラメータを更新するのではなく潜在空間を更新する.

Classifier

Decoderから出力されたサンプルをpositiveとnegativeのサンプルに用いる. 均一分布の中からランダムにサンプリングされた潜在変数から生成された画像をnegativeとして扱う.

Full OCGAN Model

f:id:hikarukondo:20200323031113p:plain

OCGANの訓練するネットワークの全体像は以下に示している. このネットワークは2スッップにわかれている. 1ステップ目は分類器以外の全てのsub-networkを固定しClassifierの訓練を行う. 実際の画像で生成されたものをTrue, 均一分布をDecoderに入力して得た画像をFalseとして学習を行う. 次に分類器の勾配を固定してauto-encoderと二つのDiscriminatorを訓練する.

$$ 10 l_{MSE} + l_{visual} + l_{latent} $$

の比率でlossを計算した. 詳しいアルゴリズムに関しては,以下の図で詳しく説明する

f:id:hikarukondo:20200323031115p:plain

ここで注目してほしいところは, $l_{mse}$ を計算する際にDecoderに代入する $l_2$ である. $l_2$ はInformative-Negative なサンプルを生成するような潜在空間を勾配効果法で局所解を求めたものである. その $l_2$ をDecoderの入力として入力して,訓練を行っている. ネットワークの苦手としている入力を探してそこを重点的に訓練するイメージだと思う.

Esperimental Results

Dataset and Experimental Results

f:id:hikarukondo:20200323031110p:plain

結果 f:id:hikarukondo:20200323031119p:plain

単純な誤差率を表す. カラーの画像の場合に弱い傾向にあるのかもしれない. アイディア自体は面白いと思った. ネットワークのauto-encoderの形状を変化させることでさらなる高性能化を期待できるかもしれないと考えた.

submoduleに対してpatchを作るのにうまく行かなくて非常にイライラした話

submoduleに対して普通に

git diff > patch

して

patch -p1 --forward < patch

したら .rejファイルが作成されてpatch当たってないやんけとなって非常にイライラしましたね

ドキュメントを読むと,

git diff --submodule=diff > patch
git apply patch

で解決します.

git submodule patch

Dockerでホスト側のファイルと同期する方法

ホスト側のファイルをDockerと動機する

みなさはcudaのバージョン管理めんどくさくないですか?私はとてもめんどくさいです。とおおおてもめんどくさいです。 だからDockerに任せることにしました!!
だってDockerならバージョンごとにコンテナ作ればいいじゃんというわけです。

pytochのDocker Imageからうまいことやる

まず今回のDockerfileはこんな感じ。

FROM pytorch/pytorch:1.3-cuda10.1-cudnn7-devel

ENV HOME=/home
WORKDIR $HOME


RUN pip install imageio tensorboard pandas scipy opencv-python torchnet torchsummary scikit-image jupyter
RUN apt-get update -y && apt-get upgrade --fix-missing --fix-broken -y
RUN apt-get install libgtk2.0-dev -y

区切りながら解説して行きます。 実行コマンドは

docker run --gpus all --rm -v 同期したいファイルのパス:Dockerのコンテナ内のパス -it Docker image名

jupyter notebookを利用する場合はportの設定があるため,

docker run --gpus all --rm -it -v 同期したいファイルのパス:Dockerのコンテナ内のパス -p 8888:8888 Docker image名

コンテナが起動したら,

jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root

でjupyter notebookを起動することができます.

でオッケイ! これで煩わしさから開放されたね!! 以上!!

パターン認識と機械学習 練習問題1.1解答

問題1.1

記念すべき第一回の記事は機械学習界隈では有名な教科書であるPRMLの練習問題です。 日本語の記事で練習問題を全部体系的にかいてあるサイトがなかったので自分が書いちゃえ的な感じです。
間違いが多いと思うので、ご指摘お待ちしております。

解答

y(x_n,\boldsymbol{w})の定義は式(1.1)より、

\begin{aligned}
y(x_n,\boldsymbol{w})=\sum_{j=0}^Mw_jx^{j}
\end{aligned}

また、二乗誤差の定義は式(1,2)より、

\begin{aligned}
E(\boldsymbol{w})=\frac{1}{2}\sum_{n=1}^N(y(x_n,\boldsymbol{w})-t_n))^{2}
\end{aligned}

また、二乗誤差が最小値を取るとき式(1,2)のw_jに関する微分は0になるから、


\begin{aligned}
\frac{\partial E(\boldsymbol{w})}{\partial w_j}   &=  \sum_{n=0}^N \frac{\partial y(x_n,\boldsymbol{w})}{\partial w_i}(y(x_n,\boldsymbol w)-t_n) \\
 &= \sum_{n=0}^N x^{i}_n (\sum_{j=0}^M w_j x_n^{j}-t_n) \\
 &= \sum_{n=0}^N (\sum_{j=0}^M w_j x_n^{i+j} -t_n x_n^i)
\end{aligned}

微分が0のため右辺=0だから,


\begin{aligned}
\sum_{n=0}^N (\sum_{j=0}^M w_j x_n^{i+j} -t_n x_n^i) &= 0 \\
\sum_{n=0}^N \sum_{j=0}^M w_j x_n^{i+j} &= \sum_{n=0}^N t_n x_n^i
\end{aligned}

題意より、


\begin{aligned}
A_{ij}=\sum_{n=1}^N x_n^{i + j}
\end{aligned}
\begin{aligned}
T_i=\sum_{n=1}^N x_n ^{i} t_n
\end{aligned}

より、

\begin{aligned}
\sum_{j=0}^M A_{ij}w_j = T_i
\end{aligned}

疑問

多くの参考サイトでもこのような解答になっているが、この解答だと最小値を取ることへの証明になっていない。このままでは、極値をとる証明をしただけである。 よって、これでは最小値を取るための必要十分条件ではなく必要条件?だとおもう。わかる人助けてください。

ここ間違ってるよって思う人は教えてください。