たけたけブログ

日々の活動をまとめています

📜 TGANに関して

f:id:ritorut18:20201104204017j:plain

どんなもの?

タイトル Temporal Generative Adversarial Nets with Singular Value Clipping
年代 2017/8/18
著者 Masaki Saito / Eiichi Matsumoto / Shunta Saito
URL https://arxiv.org/pdf/1611.06624.pdf
被引用数 201

generatorを二種類用意することで既存手法より良い動画を生成することができるGAN
WGANを参考にして学習時の不安定さの改善にも取り組んだ

先行研究と比べて何がすごい?

既存手法では前景と背景を分けて生成していたがそれでは背景が動的に変化した時に対応することができないと指摘した。
また単純に3Dconvを導入しても時間方向の性質は空間方向の性質とは異なるため良い動画を生成できないと考察した。

技術の手法や肝は?

  1. generatorを二つ準備した点
    単純な入力ノイズから一続きのノイズ(latent variables)を生成するgeneratorを挟み、その一続きのノイズから動画を生成することでより良い動画を生成することができた
  2. WGANを参考に学習時の不安定さを改善した点
    WGANを参考にlossを改良しただけでなく、WGANのハイパーパラメータの不安定さの改善にも取り組んだ

どうやって有効だと検証した?

定量評価

movingMNISTというdatasetを使ってGAM scoreを測定し、比較
UCF-101というdatasetを使ってInception Scoreを測定し、比較
いずれの場合も提案手法(TGAN)が良い結果を示した。またWGANの最適化アルゴリズムであるSVCの有用性も確かめられた

定性評価

3Dconvを使ったGAN(3D model)とVGANと提案手法の三つで比較検証を行った。各datasetごとに多少設定を変えて比較をしている。どの比較項目でも提案手法が一番良い動画を生成すると主張している。

議論はある?

提案したSVCというWGANの最適化アルゴリズムは調整が大変なので最善な改善策とは言えないそう

次に読むべき論文は?

  • MoCoGAN

📜 ざっくり翻訳

Abstract

Generatorを工夫した。
最初のgeneratorである、Temporal Generatorは一つのlatent codeを一続きのlatent code(入力ノイズ)に変換する。
次のgeneratorである、Image Generatorは一続きのlatent codeを動画に変換する。
また、GANの学習時の不安定さをWGANを参考にした構造を取り入れることで改善した。

1. Introduction

依然として動画GANは難しい。
既存の研究は前景と背景を分けて生成していたが、欠点が存在する。
それは、動的に背景が変化した時に対応することができない点

動画GANの単純なアプローチとしては3Dconvを使うことにあるが、時間方向の次元の性質は空間方向の次元の性質とは異なっているためうまく動画を生成することができない。

本研究ではgeneratorを二つ準備することで既存手法よりも良い結果を示すことができた。それがTemporal GeneratorとImage Generatorである。 加えてGANの典型的な問題である学習の不安定さに対しても改善を施した。WGANを参考にしたがハイパーパラメータの部分を更に改良することで安定性を向上させた。

2. Related Works

3. Temporal Generative Adversarial Nets

3.1 Generative Adversarial Nets

一般的なGANのloss関数の説明

3.2 Wasserstein GAN

WGANのloss関数の説明

GANの学習は不安定でパラメータの調整が重要になってくる。これを解決するためにWGANが考えられた。
一般的なGANはJSダイバージェンスを最小化するのだが、WGANではEarth Mover’s distance(EMD)という値を最小化することで学習を進める。著者の実験からWGANは一般的なGANよりロバストであり、mode droppingを避ける傾向にあることがわかっている。
WGANの学習で重要な部分に、K-Lipschitz制約というものがある。discriminatorがK-Lipschitz制約を満たす時にWGANのloss関数が以下の形で表される。

本論文ではこのloss関数を参考に用いる。

3.3 Temporal GAN

提案モデルの説明(下図)

前述したようにTGANは二つのgeneratorからなる。最初のTemporal Generatorでは単一のlatent variable($$z_0$$)を使って一続きのlatent variables($$z_{1}^1 $$,...,

$$z_{1}^T$$)を生成する。

その後Image Generatorで一続きのlatent variablesと単一のlatent variableを使って動画(T個のビデオフレーム)を生成する。
$$z_0$$をImage Generatorにも用いることで生成画像の動作の突然変異を抑制することができるそう。
以上より、TGANのloss関数は、以下の形になる。

xt : datasetのt番目のビデオフレーム
z{1}^t : 生成したt番目のビデオフレームに対応する潜在変数
\theta
{D}, \theta{G_0}, \theta{G_1} : discriminatorD, generatorG_0, G_1のパラメータ

3.4 Network configuration

ネットワークの詳細設定

4. Singular Value Clipping

5. Applications

5.1 Frame interpolation

提案手法の有用性として、隣接したframeの中間frameを生成することができる
TGANは生成したい動画の潜在空間での軌跡を生成するので長期間の動画の生成が可能

5.2 Conditional TGAN

datasetの動画はラベル付されることがあるので対応するために条件付きTGANというものも作成した。CGANのように指定されたラベルに合わせた動画を生成することができる。CGANと似た構造をもち、最初の乱数ベクトル$$z$$を、one-hot表現されたベクトル$$u_l$$と$$z_0$$を合わせたベクトルに替える。
discriminatorの場合は、one-hot表現されたベクトルと同次元のベクトルを用意し識別する動画と合わせて入力する。

6. Experiments

6.1 Datasets

datasetsの説明

6.2 Training Configuration

訓練時の設定について

6.3 Comparative methods

比較するモデルについて

  1. 3D model 一番簡単なモデル。
  2. Video GAN

6.4 Qualitative evaluation

定性評価
まず四つのモデルを比較検証した。moving MNISTというdatasetを利用。
提案手法が一番良い動画を生成することができた。
3D modelが一番悪い結果になったが、時間成分と空間成分は分けて考えた方がいいということが結果から考察できる。
またcとdを比較すると、$$z_0$$を導入することでmode collapseが生じ辛くなっている。

次に実用的なdataset(UCF-101)で検証した。
3D modelはアーチファクトが入りやすくなっている。
VGANは理解不可能な動画になっている。
こういった問題は既存手法では背景が動的である時に対応できないということが考察できる。

また中間frameの補間実験や指定した動画の生成実験をしてTGANの有用性を示している。

6.5 Quantitative evaluation

定量評価
moving MNISTでGAMを計測する。
これはモデルを二つ用意して一方のgeneratorで生成した動画をもう一方のdiscriminatorで真偽判断をするというもの。
1より大きい場合はmodelAの生成動画の方が精度が高いと判断する。(1より小さい場合はmodelBの方が良い動画を生成したと判断する)
提案手法と3Dconvを使った標準的なモデルを比較していずれの場合も提案手法の生成動画が良いという結果となった。

次にInception Score(IS)を計測する。
UCF-101を使用していくつかのモデルのISを測定し比較した。
結果から提案手法が一番いい結果となった。またWGANの最適化アルゴリズムであるSVCの有用性も確かめられた。

7. Summary

​​本論文では、1組の潜在変数(latent variable)を生成しそれを画像に変換することで動画の生成プロセスを定義した。

​​この方法を使うことで、高品質な動画を生成でき自然なフレーム補間を実現した。
​​またWGANの最適化アルゴリズムであるSVCを提案した。

📜MoCoGANに関して

f:id:ritorut18:20201103211501p:plain

どんなもの?

動画をmotionとcontentにわけて考えることで生成精度を向上させた動画生成GAN

内容
タイトル MocoGAN: Decomposing Motion and Content for Video Generation
年代 2017
著者 Sergey Tulyakov/Ming-Yu Liu/Xiaodong Yang/Jan Kautz
URL https://arxiv.org/pdf/1707.04993.pdf

先行研究と比べて何がすごい?

先行研究は二種類に分けることができる。

1.the future frame prediction problem

future frame predictionの目的は、ビデオの次のframeを予想すること。
GANの入力は乱数による入力ノイズだが、future frame predictionの入力は前のframeである。
-> 違うアプローチになってしまう

2.VGAN, TGAN系

ビデオを潜在空間上の一点と対応させようとするのは問題が複雑になってしまう

  • 同じactionでも動作速度が異なっていた場合、潜在空間上での対応する点が異なってしまう
  • 生成するビデオの長さが固定してしまう

-> 解決策を提示した

技術の手法や肝は?

潜在空間上の一点から画像を生成、それらを繋いで動画にする
潜在空間をmotion subspaceとcontent subspaceにわけることで前景と背景を分離
同動作で速度が異なる場合はmotion variable の変化速度をかえることで対応することができる

提案モデルに関して

MoCoGANは機能的に四層からなる。

R_M

入力ノイズをcontentとmotionに分けて考える。以下のように表現できる。

motionの流れに関してはRNNを使って補完する
RNNによってi.i.dである入力ノイズ εを相互関係のある変数z_M^{(k)}に変換する (MoCoGANでは一層のGRUで表現した)

G_I

D_I

こちらは1frameごとのビデオクリップを使用してこれがG_Iから生成されたものか本物のビデオクリップなのかを判断する
D_Iを導入した方が収束条件が改善するそう

D_V

こちらは適当な長さのビデオ(Tframe)を使用してG_Iから生成されたものか本物のビデオクリップなのかを判断する
D_Vはspatio-temporal CNNを使う。ここでmotionに関する評価を考える。

loss関数に関して

adversarial lossを改良して定義している。
改良点は、1frameでの識別(D_I)とTframeでの識別(D_T)を考慮する点

動作の分類について

RNNでmotionを改良するが、その時にどの動作をするのかを決めるlatent codeを導入する(ont-hot vector
その学習にInfoGANの考え方を導入してloss関数を改良する

どうやって有効だと検証した?

三つの実験を通して有効だと検証した。

Video Generation Performance

一番メインの部分。
一つの動画でcontentが一貫しているかどうかを示す指標ACD(Average Content Distance)を定義して一貫性の検証を行った。
また生成動画をAMTを利用して定性評価をおこなった。
どの検証も一番いい結果を残した。

Categorical Video Generation

提案したモデルの有用性のablation studyをおこなった。
contentの一貫性だけでなくmotionのリアルさを評価した。
行動認識の識別器を用意して生成動画の行動(今回は表情)を識別して数値化した。(MCS(Motion Control Score))

Image-to-Video Translation

一枚の画像をランダムで抽出して動画を生成するというタスクをMoCoGAN, C-VGAN, MCNETの三つで比較
MoCoGANが一番リアルな動画を生成するという結果になった

議論はある?

細かい部分がしっかり生成できていないみたい

次に読むべき論文は?

Decomposing Motion and Content for Natural Video Sequence Prediction

Unsupervised Learning for Physical Interaction through Video Prediction

  • 過去のframeのpixelをかき混ぜて新しいframeを作る
  • 画像をconv LSTM で畳み込んでフィルターを作り,そのフィルターを元画像に当ててpixelを再構築する

    Generating Videos with Scene Dynamics(VGAN)

  • 動画をforeground(動くもの)とbackground(動かないもの)に分割
  • 同一のnoiseからdeconvでそれらを生成し加重平均をとる
  • 画像で条件つけてfuture predictionさせることも可能

    Temporal Generative Adversarial Nets with Singular Value Clipping(Temporal GAN)

  • 3Dの畳み込みを批判 → 時間と空間の特性の違いを考慮すべき しかし,今回Discriminatorは3Dの畳み込みを利用している…Generatorのみ特別仕様

  • temporal generatorがframe数だけlatent variableを生成しそれを元にimage generatorが個々の画像を生成
  • 生成した二枚の画像間の中間画像も容易に生成できる
  • WGANを改良(singular value clipping)して学習を安定化

サイバーエージェントのおうち Kubernetes インターンに参加して(続き)

はじめに

こちらの記事は以前掲載したブログの続きになります。
簡単に説明いたしますと、2020年9月にサイバーエージェント主催の7days インフラ向け開発型インターン ONLINEというものに参加いたしました。参加前の準備や参加しての感想などは前の記事で書いたのでぜひご覧ください。
ここでは実際にインターンで何をやっていたのかをまとめていきたいと思います。
(順次更新予定)

挑戦したこと

私が取り組んだのは、

  1. ラズパイを使ったクラスタ構築(物理)
  2. hardwayでのk8sクラスタ構築(論理)
  3. CNIpluginの交換
  4. etcdの高速化
  5. istioの導入

です。それぞれ説明していきたいと思います。

1.ラズパイを使ったクラスタ構築(物理)

参加者は最初にラズパイ三台を使ってk8sクラスタを作成します。詳細はこちら
作成したマイクラスタはこちら。約10cm * 10cm * 10cmの立方体になってます。サイズ感が可愛いですよね笑

2.hardwayでのk8sクラスタ構築(論理)

次にk8sが動くように論理構築になります。このパートも参考リポジトリをみて作業を進めました。私はhardwayというk8sをじっくり理解する方を選択して取り組みました。詳細はこちら

3.CNIpluginの交換

各自一通りクラスタを構築した後は独自の課題を設定して取り組みました。私はk8sの各コンポーネントをより深く知るためにhardwayのリポジトリを再読したりいくつか変更できる部分を交換しました。
その一つにCNIpluginがあります。参考リポジトリではtype: bridgeを使いルーティング情報を入力してpod間通信を確立していました。それをCalicoに変えてみました。

Calicoについて
こちらはCNIpluginの一つでネットワークとネットワークセキュリティを設定できるものです。詳しくはこちら

今回はCalicoを使ってpod間のネットワーク設定を導入しその後NetworkPolicyというpod間通信の制御を試してみました。 一通りクラスタができている状態だったのでそこからどのようにCNIpluginを換装するのかを調べるのが少し大変でした。換装の手順はこちらを参考にしています。

4.etcdの高速化

NetworkPolicyを試したことでpod間のトラフィックに興味を持ちました。そのことをメンターさんに相談するとサービスメッシュという考えを紹介していただきました。詳しくは次の章で説明します。サービスメッシュを導入する過程でetcdと通信する必要があるのですが、何度もタイムアウトエラーになってしまいました。

{"level":"warn","ts":"2020-09-29T04:57:06.254Z","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-06270522-29c4-4880-9ee5-ea6115ecffd5/127.0.0.1:2379","attempt":0,"error":"rpc error: code = Unavailable desc = etcdserver: request timed out"}

そこでetcdを高速化するべく以下の改良を施しました。

  1. etcdをメモリ上に移動
  2. システム起動時と終了時にetcdのデータをSDカードに保存(永続化)

5.istioの導入

前章の作業を終えてetcdの通信速度が向上したのでistioの導入に進みました。 istioというのはサービスメッシュを実現するためのソフトウェアです。podの隣に「サイドカープロキシ」というものをつけpod間通信をサイドカー経由にすることでトラフィックを把握することができるようになります。俯瞰的に見るとメッシュ状に接続されていることからサービスメッシュという名前になったそうです。詳細はこちら
istioの公式サイトを参考に導入に進みました。作業上の注意点は、CPUアーキテクチャの違いを考慮する点です。マニフェストファイルのコンテナイメージはDockerHubから取得するのですがそれがarm64対応でないことが多く、確認する必要があります。affinifyの部分も確認しました。
次にistioの検証用環境をラズパイ上に構築しました。検証環境はistioの公式サイトにあるbookinfo applicationというサンプルアプリケーションを参考にしました。こちらもマニフェストファイルのコンテナイメージを確認しながら作業を進めました。インターン中にjavaのコンテナイメージをarm64対応にすることができなかったのでレビューページは作成できませんでしたが、それ以外の部分はなんとか作成することができました。
下図は作成したアーキテクチャ図です。

アーキテクチャ図

下図はkialiで捉えたトラフィック図です。トラフィック全体がスクリーンに入りきらなかったので恐縮ですが、通信できている部分は緑になっています。

kialiで捉えたトラフィック図


LT会

インターンではメンターさんによるLT会が企画されていることもありました。メディア、広告、ゲームの三つの事業から社員さんが一人ずつ発表されて日頃の業務内容や扱っている技術、最近やっていることなどざっくばらんに聞くことができました。社外秘が多いので詳細はお伝えできないのですが、ざっと何をお話しされていたのかをまとめました。

メディア

メディア事業部ではパブリッククラウドサービス(AWS, GCP)だけでなく自社で作ったプライベートクラウドサービス(Cycloud)を実際の事業で活用しています。今回のLT会ではCycloudの中身や取り組んでいることを教えて頂きました。最後にはエキシビジョンということでDockerの「マルチCPUアーキテクチャサポート」のイメージビルドについて説明して頂きました。

広告

サイバーエージェントにはSIA(Strategic Infrastructure Agency)というAI事業本部向けにインフラを整備する組織があります。そこではプライベートクラウド、AKE(Adtech Container Engine)、GPUaaSなどのインフラ基盤の保守管理を担当しています。今回は2016年後半にAdtech Studioで検証開始され、現在AI事業本部で運用されているAKEについて説明して頂きました。今年のCNDT2020では監視基盤についての発表がありました。

ゲーム

サイバーエージェントにはゲームとエンターテイメント事業に携わる子会社が所属している組織SGEがあります。 実態は九つの子会社からなるもので各社の強みを生かした開発とノウハウの共有が目的となっています。ゲームを開発する上でパブリッククラウドサービスを利用しているのですがどのように利用しているのかや、各子会社ごとのインフラの違いなどを教えていただきました。

インターンを終えて

ここからは自戒の念を込めて反省を書きたいと思います。

力量を常に把握すること

始まる前から予想できたことでしたがやりたいことに対して時間が足りなかったです。そんな状況で必要なのは実現可能な計画を立ててそれをしっかりこなすことだと学びました。

元々インターン期間中に k8s 上で自作アプリを動かすことを目標にしていましたがクラスタ作成で二日間かかりメンターさんから難しいと指摘されました。そこで k8s の理解に専念するという方針転換をしました。クラスタ完成の時点では「なんとかなるだろう」と楽観視していたのでこの一連の再考を通して自分の作業管理の甘さを痛感しました。作業計画を立てるためには、自分の力量(技術力、理解までにかかる時間)の把握が必要です。まずは力量の把握からはじめていき、今後現実味のある計画を立てれるよう頑張りたいと思います。

基礎知識は大切

これはあらゆるところで言われていますが、このインターンでも痛感しました。今回 k8s を扱うにあたって様々な知識が要求されました。しかし一番必要なのは初歩的な理解であると痛感しました。

設定段階でもそうですが私が痛感したのはトラブルシューティングの時です。自分だけでは解決できずメンターさんに質問すると、瞬時に必要なログと現在の設定状況を問われました。その後指示された作業をして解決することができたのですが、この解決力が自分には足りないと感じました。

k8s は複雑な処理を「いい感じ」にこなしてくれる便利な技術ですが、エラーが起きた時に対応が難しいと感じています。しかし k8sブラックボックスではなく既存の技術の上にできています。つまり基盤技術をしっかり理解できれば対応可能であると身を以て経験しました。これからは新しい技術を知るだけでなくその技術の元になっている概念や技術を理解していこうと思いました。

インターンで取り組んだことをしっかりと自分の血肉にして今後も精進していきたいと思います。ありがとうございました!

サイバーエージェントのおうち Kubernetes インターンに参加して

はじめに

(追記(2020/10/11):参加結果を追加しました)

内容
いつ(期間) 2020年9月 (約1週間)
どこ (主催者) オンライン (サイバーエージェント
だれ(参加者数) 個人開発(参加者20人ぐらい)
なに(作業内容) ラズパイを使ったk8s開発

私が今回参加したのはサイバーエージェントが主催していた7days インフラ向け開発型インターン ONLINEというものです。

内容はラズパイを三台使って k8s クラスタを作成しその後参加者ごとに課題を決めて取り組むというものでした。
事前に構築に必要なものが郵送され仕様書となる Githubリポジトリを参考に進めるという流れです。
k8s クラスタを作る部分はkubeadmを使った構築と一つ一つ自力で設定する構築の 2 種類がありました。私は後者の方を選択しました。こちらはhard wayといいこちらGitHub を参考に作成したそうです。

インターン

参加の経緯

私がこのインターンに参加しようと思ったきっかけは今年の 7 月に行われたサポーターズ主催の技育祭です。ここで本インターン主催メンバーの青山さんの公演を聞き k8s についてもっと知りたいと思うようになりました。
参加するまで docker を使って開発を行っていたので興味はあったのですが勉強する一歩が踏み出せていない状況でもありました。今回のインターンを通して k8s について知るとともに k8s を取り巻くcloud native技術に触れたいと思い参加を決めました。

参加前のスキル

参加するまでに私は web 開発の経験がありフロントからバックまで広く浅く知っているという状態でした。 インフラに関しても docker を使ってデプロイしたりログ取得の環境を整えたりというように公式のチュートリアルを少しいじれるぐらいのスキル感でした。

参加までのフロー

参加決定までの流れは、

  1. エントリーシートを記入
  2. 書類選考を抜けたのちに面接

です。他の web 企業は書類選考と同時にコーディングテストがあるのですがサイバーエージェントではそれがないので思いっきり k8s への熱意と参加の意欲をぶつけました。それが良かったのかもしれません笑

インターン前の準備

サイバーエージェントではインターンを始める数日前にオリエンテーションが開催されます。目的としては顔合わせと目標設定、その他諸連絡です。
個人的にはこの会が今後の開発に活きたと感じています。このインターンを軸に今後どうするのかをしっかり考えることで 1 週間という短い期間を有効活用することができました。具体的にはインターン後の自分を思い描き、実現するためにはインターン中何をするのかを決め、そのために開始前の期間で何をするべきなのかを設定しました。
これはこのインターンに関わらず様々なところで活きる考え方なので今後も意識して取り入れたいと思います。

インターン

(詳細は別途書きます)

やったこと

インターンは実質五日間(土日除く)で行われました。初日は自己紹介をしたのちにメンターさんから本インターンの説明がありました。 その後四日間は2−3 人のチームに分けられて各々開発に専念するという感じで進みました。 1 日の流れは、

  1. 10 時ごろに朝会をしてその日の連絡事項を聞く
  2. 作業を進める(私のチームは zoom をずっと繋いで作業していました)
  3. 午後に LT 会がある日は参加する。サイバーエージェントのインフラエンジニアについて知る
  4. 19 時ごろにチームごとに進捗報告をして終了

という感じです。ただ五日間しかなかったのでその日の進捗報告が終わった後も作業を進めていました笑

最終発表について

そして最終日は一人 3 分のプレゼンがありました。約 1 週間何をしてきたのかを報告しました。 私はクラスタを作成したのちに pod 間の通信に興味を持ち、CNIを変えてみたりistioを導入して理解を深めました。 他の参加者は

  • ログ監視基盤の構築(prometheusgrafanafluentdelasticsearchなど)
  • ansible で hardway の内容を自動構築
  • 自作のアプリをクラスタ上で動かす

などに取り組んでいました。どれも魅力的で私も挑戦してみたいと思いました!
他の参加者が取り組んだ例

インターンを終えて

感想

約 1 週間のインターンを通して k8s の仕組みを理解することができました。hard wayに取り組んだことで各コンポーネントの役割や設定方法を知ることができ、k8s が既存の技術の上にできていることを実感しました。また設定を地道にやったことでインフラの基礎的な理解が深まりました。特にCNIpluginを交換したことでネットワーク周りの知識がついたと思います。

また CPU アーキテクチャの違いを意識するようになりました。k8s クラスタを作る上でラズパイは手軽で設定も楽なのですが、DockerHub からイメージを持ってこようとした時ベースイメージがarm64対応でないと動きません。アーキテクチャの違いを考慮して作業することが多く正直大変でした...

最後に、メンターさんを通してサイバーエージェントについて詳しく知ることができました。 今回のインターンでは各チームにメンターさんが一人配属されました。些細なことからかなり込み入ったことまで相談に乗っていただき最終日は深夜二時まで付き合っていただきました。本当にありがとうございました🙇‍♂️
開発以外のこととしては、午後にLT会を開催していただきサイバーエージェントの裏側を垣間見ることができました。ゲーム、メディア、広告の三つの事業から社員さんが一人ずつ発表されて日頃の業務内容や扱っている技術、最近やっていることなどざっくばらんに聞くことができました。

このインターンを通して個人ではできないことを経験することができました。今後とも精進していきたいです。1週間という短い間でしたが大変お世話になりました。ありがとうございました。


結果、最優秀賞をとることができました。
アベマくん大切にします笑 ありがとうございます!

f:id:ritorut18:20201011172311j:plain

他の参加者のブログ

公式のブログ
Lapi さんのブログ