深層学習を学習しなおすメモ

## この記事の目的と対象

深層学習のトレンドについて、一般的な話は訳知り顔でできるが、技術的詳細を突っ込まれはじめると、しどろもどろになってしまうようなエンジニアが、個別の技術を学び直すための手がかりのメモです。

この記事は、偏微分や勾配降下法という概念は覚えている、ディープではないニューラルネットワークくらいはさすがに原理を覚えている、くらいの理解度を前提としています。そして、門前の小僧として、個別の深層学習のトレンドの記事はパラパラ見たことがあるが、細かいところはすっかり忘れてしまった、というエンジニアを対象としています。

つまり、この記事のターゲットは、半年後の私です。

随時更新。

## 体系的に１から学びたい

本当にしっかり身につけたいエンジニアは、『[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)』のシリーズが手を動かしながら理解できる良い本と聞き及びますので、そちらを腰を据えて取り組まれると良いのではないでしょうか。

## 個別技術をキャッチアップする

YouTube でのソニーの方の解説動画が、なぜその技術が必要とされたのか、という文脈も含めて説明してくれていることが多いので、技術の位置づけが分かりやすくてオススメです。

### GELU / Swish
活性化関数といえば ReLU だと思っていたのですが、BERT や GPT では GELU が用いられると聞きました。

GELU は正規分布の累積分布関数が用いられているようなのですが、初等関数では計算できないので、近似式を用います。Swishはそこからさらに性能が高くなったらしい活性化関数。

なお、ReLU は演算速度に関しては他の追随を許さないので、今後も活用され続けることでしょう。

- GELU
    - https://cvml-expertguide.net/terms/dl/layers/activation-function/relu-like-activation/gelu/
- Swish
    - https://www.youtube.com/watch?v=cTvJ-jj63U4

### Adam
学習時のパラメータの更新の最適化は Adam を知っていればだいたいよいらしい。
AdamはモメンタムSGDとRMSPropを組み合わせたもの。

- https://www.youtube.com/watch?v=q933reMpvX8
    - 各最適化手法の違いが動画でよく分かる。モメンタムSGDの動きが気持ちいい。
- https://qiita.com/omiita/items/1735c1d048fe5f611f80

### CNN の心
CNNというのは、要するに、画像など入力値が多い場合は、全結合してしまうとパラメータがすごいことになってしまうので、結合をいかに減らしていくかというテクニックの話だと認識しています。パラメータを減らした際に、上手く対処したい問題に適した構造が作れれば、学習も速やかに行えます。画像の場合は、隣接領域に関連する情報があることが多いのだから、隣接領域でまずはネットワークを作ろうというのがCNNです。

- https://www.youtube.com/watch?v=UximUEjPQco
    - CNN で小さい畳み込み層を重ねることが流行っている理由など、分かりやすく説明されています。

### U-Net
画像を処理するときに、高解像度のままだとパラメータ数がすごいことになるので、プーリングで解像度を落としながら本質的な情報だけを残していくのですが、出力時に高解像度画像で受け取りたい場合、一度解像度を落としてからでは、後段で拡大を頑張っても無理があったりします。

その解決策として、前段でのプーリング直前の解像度が高い情報を、後段の同じ解像度の層に直接つなぐことにより、解像度が高い出力を得やすくした構造です。

- https://www.youtube.com/watch?v=05qlCP-xL9Y

### LSTM
LSTM は、グルグルと状態を回し続けながら時系列データを処理するRNNに対して、こういう状況の時は、状態を更新しなくて良くて、なんなら忘れてしまって良い、というゲート制御を追加したものです。

時系列データを扱いたいときに用いられていた RNN では遠くの過去の情報がどんどん失われてしまうので、LSTM (Long short-term memory) が良い、と何年か前に読んだ覚えがあるのですが、系列データをひとつずつ処理しないといけないため、近年では応用によっては入力トークンを全て並列に計算できる Transformer に置き換えられがちという印象（素人の印象です）。

- https://www.youtube.com/watch?v=unE_hofrYrk
- https://www.youtube.com/watch?v=RoVxoJF0Z5Q
- https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca

### Sentencepiece
指定した語彙数で、（機械学習にとって）いい感じのテキストの分割、符号化をしてくれるのが、Sentencepieceです。

自然言語処理でテキストを深層学習のネットワークに入れるためには、テキストを何らかの数値列に符号化しないといけないのですが、英文のワード単位などで符号化されると非英語圏で使えないことになってしまいます。

日本語を食わせたいときにトークナイザとして使っておくととりあえず安心なやつ、という理解。

- https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c

### Attention
Transformer の中核技術。Key と Value と Query という登場人物が出てきます。要するに、深層学習のネットワークを工夫して、Dictionary 的な構造を作るというワザ。これを使って、算出した Query に応じて、対応する Key に一致する Value を引っ張ってくるという処理ができるようになり、入力データの一部だけに着目するという処理が少ない計算量で実行できるようになりました。

- https://www.youtube.com/watch?v=g5DSLeJozdw
    - 画像処理での Attention を最初に説明することにより、よりイメージしやすく。
- https://www.youtube.com/watch?v=Sc4z23mqI4A

### Transformer
BERT や GPT など、自然言語処理の性能が爆上がりした世代の言語モデルの基幹技術。Imagenなどの画像生成技術でも、使われています。

入力を encoder で比較的情報量の小さいパラメータ空間に圧縮した上で、decoder で目的の形に復元する。翻訳などが得意。

- https://tips-memo.com/translation-jayalmmar-transformer
    - イラストがたくさんあって分かりやすい。
- https://www.youtube.com/watch?v=oVEkXMu4e-s
- https://speakerdeck.com/yushiku/20220608_ssii_transformer
    - Transformer の説明を他の場所で何度も読んだり聞いたりしたあとに読むと染み渡る。
- Transformers を便利に使えるライブラリ
    - https://huggingface.co/docs/transformers/index
    - 使い方　https://note.com/npaka/n/n5bb043191cc9

### BERT, GPT-n, T5
自然言語処理の各タスクについて、事前に言語モデルを膨大な量のコーパスから学習させてから、各タスクにファインチューニングすると性能がとても良くなるよ、というモデルたち。

言語モデルは、基本的には入力列から次の単語を予測するというタスクですが、BERTは双方向からの単語穴埋めと文の連接判定を同時に解いています。T5はText-to-Textで表現可能に調整された様々なタスクを学習。

- GPT-1
    - https://www.youtube.com/watch?v=M0vCRwsG-yo
- BERT, T5
    - https://www.youtube.com/watch?v=1yS2PX8eG70
        - BERT内のマルチヘッドAttentionでどのような注意が向いているかの紹介なども
- GPT-2, 3
    - https://www.youtube.com/watch?v=pVUfrfrVPKE

### ChatGPT
OpenAIによる最新のチャットAI。GPT-3.5に対して、人間が好むチャット回答を返せるように、人間を教師として再学習したもの。

- https://qiita.com/omiita/items/c355bc4c26eca2817324

### Vision Transformer
CNN を通した結果の特徴量を Transformer に突っ込む手法。

CNN は局所的な関係性を抽出するのが得意だが、Transformer であればグローバルな関係性に注目することができる。また、Transformer は大規模なデータを食わせると汎化性能が良くなるという実例がたくさんあるので、それをvisionの分野でも活用したい、というモチベーション。

- https://www.youtube.com/watch?v=l8kjADOcsKE

### CLIP
画像とそのキャプションをたくさん食わせることで、画像とテキストの距離を計算できるようになったという技術。

テキストの encoding には Transformer、画像の encoding には Vision Transformer を使う。

- https://www.youtube.com/watch?v=eAbC7szTRMY の中盤
    - 関連技術との位置づけ https://www.youtube.com/watch?v=eAbC7szTRMY
- https://www.youtube.com/watch?v=7UsMRGzt9BI
- https://openai.com/blog/clip/
- https://rinna.co.jp/news/2022/05/20220512.html
- StyleCLIP
    - https://www.youtube.com/watch?v=j6oMAUCKGm8

### Diffusion Model, DALL-E, DALL-E2, Imagen

- Diffusion model
    - https://www.youtube.com/watch?v=10ki2IS55Q4
    - https://www.youtube.com/watch?v=2h9tlkx6qkk
- DALL-E
    - https://www.youtube.com/watch?v=eAbC7szTRMY の中盤
- DALL-E2
    - https://www.youtube.com/watch?v=kF3v3_hsWUQ
        - 前編（情報量が少ない) https://www.youtube.com/watch?v=8Io3MudjOGg
- Imagen
    - プロンプトを大規模言語モデルで解釈してからdenoiserに入れる。
        - 形容詞と名詞の係り受けなどもよく理解する。
        - 単語を綴り間違いせずに画像の中に出せる。
    - https://www.youtube.com/watch?v=N6lJvkoku9s
- Stable Diffusion
    - https://jalammar.github.io/illustrated-stable-diffusion/
- diffusers
    - 拡散モデルを使う各種モデルを統一のインターフェイスで使えるように整備したライブラリ
    - https://github.com/huggingface/diffusers

### DDIM, PLMS
Diffusion model では、単純な denoise だけでは計算量が多すぎるので、さまざまな高速化が行われている。その高速化した denoise のやり方のバリエーションに DDIM や PLMS がある。

- DDIM
    - https://www.youtube.com/watch?v=zeUu0chaAo8
        - part1は https://www.youtube.com/watch?v=wc_LLNk4jrU
    - https://www.youtube.com/watch?v=9Eu8WvKmkRA
- PLMS
    - https://www.youtube.com/watch?v=TiBvyozb_jg
    
### NeRF
複数の視点画像から、三次元の形状を推定する研究の一環として、自由視点でのレンダリング結果を得られるようにしたモデル。

初期の論文のレンダリング方程式が適当だったので、ちゃんと正しいレンダリング方程式にしたら精度が上がったというような論文をどこかで見た覚えがあり、これぞ学際領域と思ったものでした。

- https://www.youtube.com/watch?v=l8kjADOcsKE の中盤
- https://ai-scholar.tech/articles/nerf/nerf
- https://techblog.leapmind.io/blog/introduction-to-nerf-without-math/

### DreamFusion
テキストからNeRFの生成を、テキストから2D画像を生成する大規模モデルだけで実現したという論文。テキストから2D画像を生成するモデルの内包している知識には、三次元形状も含まれているということですね。量で殴ってくる最近のトレンド通りの話。

- https://www.youtube.com/watch?v=pJg4qY3hOzA

### 姿勢推定
カメラ画像からの姿勢推定。同じ技術名でも、年々更新されていっているので、ネット上の記事はいつ頃の実装について述べているのかをチェックする必要がある。

github で公開されているのはありがたいのですが、利用に色々制限があるので、よくライセンスを調べてから使う必要があります。

- OpenPose
    - https://qiita.com/jjjkkkjjj/items/c56085f72d4f508a7570
    - https://github.com/CMU-Perceptual-Computing-Lab/openpose
- BlazePose
    - https://google.github.io/mediapipe/solutions/pose
- HRNet
    - https://book.st-hakky.com/docs/keypoint-detection-hrnet-overview/
- VoxelPose
    - https://www.slideshare.net/DeepLearningJP2016/dlvoxelpose-towards-multicamera-3d-human-pose-estimation-in-wild-environment
    - https://github.com/microsoft/voxelpose-pytorch
- AlphaPose
    - https://qiita.com/miu200521358/items/a51d26d978b2298464e5
    - https://github.com/MVIG-SJTU/AlphaPose/
- YOLOv7 Pose
    - https://tt-tsukumochi.com/archives/3549
    - https://www.youtube.com/watch?v=AWjKfjDGiYE
    - https://github.com/WongKinYiu/yolov7
- E2Pose
    - http://cedro3.com/ai/e2pose/
    - https://github.com/AISIN-TRC/E2Pose

### GNN
グラフ構造をニューラルネットワークで扱うための手法。SuperGlueなどで使われている。

- https://www.youtube.com/watch?v=wZH709M7vOA

### SuperGlue, LoFTR, DKM
画像特徴量のマッチングを行う。

- SuperGlue
    - https://tech.fusic.co.jp/posts/2020-09-08-ai-super-glue-gnn/
    - https://blog.negativemind.com/2020/07/29/hierarchical-localization-toolbox/
- LoFTR
    - https://tech-blog.abeja.asia/entry/awesome-deep-homography-202004
    - https://zju3dv.github.io/loftr/
- DKM
    - https://github.com/Parskatt/DKM

### Whisper
OpenAI による音声toテキストのモデル。

```
> pip install git+https://github.com/openai/whisper.git
```

だけでコマンドラインツールとしてインストールできるお手軽さが嬉しい。

v1では日本語の長文書き起こしを苦手としていて、[whisper-webui](https://huggingface.co/spaces/aadnk/whisper-webui)を使ってSilero VADを挟まないと精度が出なかったのですが、large-v2モデルであれば、そのまま使うだけで日本語長文でも素晴らしい書き起こしの精度がでます。

あと、タイムスタンプ付きで出すこともできますので、SRT形式で出力して、そのままYouTubeに字幕をつけられたりも。

なお、多言語音声から英語テキストへの翻訳機能は標準でサポートされていますが、ツールとしては英語以外への翻訳はサポートされていません。しかし、書き起こしモードで language に日本語を指定した上で英語音声を読み込ませると、普通に日本語で出てきたりします。このあたりの大雑把な感じが大規模言語モデルですね。

- https://medium.com/axinc/whisper-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E5%90%AB%E3%82%8099%E8%A8%80%E8%AA%9E%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%A7%E3%81%8D%E3%82%8B%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%E3%83%A2%E3%83%87%E3%83%AB-b6e578f55c87
- https://zenn.dev/kwashizzz/articles/ml-openai-whisper-ft

### VALL-E
Microsoft による text-to-speech。未知話者の3秒の音声を音声プロンプトとして入れるだけで、その声色、感情、音響環境を保った音声の生成ができることがウリ。

音声を EnCodec により離散コード化し、それを大規模言語モデルとして学習することで、性能を実現。6万時間の英語音声で学習。

- EnCodec
    - Meta による、24kHzの音声信号を6kbpsまで縮めて元に戻せるモデル。
        - 実は、圧縮先は1.5kbps〜24kbpsまでラインナップがあり、48kHzのステレオ音楽を圧縮できるバージョンもある。
    - https://github.com/facebookresearch/encodec
- VALL-E
    - https://valle-demo.github.io/