サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
musyoku.github.io
概要 Chainerのモデル定義クラスを新たに作った はじめに ChainerのChainをもう少し楽に書くの続きです。 昔書いたAdversarial AutoEncoderのコードを書きなおしていたんですが、モデル定義の部分を簡潔に書くのが難しかったので新たにモデル定義クラスを作りました。 musyoku/chainer-nn chainer.Chainのモデル定義はもともと以下のように書きます。 class Model(chainer.Chain): def __init__(self, n_in, n_hidden, n_out): super(Model, self).__init__() with self.init_scope(): self.layer1 = L.Linear(n_in, n_hidden) self.layer2 = L.Linear(n_hidden,
概要 Training RNNs as Fast as CNNsを読んだ Simple Recurrent Unitを実装した はじめに この論文ではRNNの高速な実装方法を提案しています。 LSTMに比べて5倍から10倍程度高速化できます。 内容的には前回のQRNNとほとんど変わりません。 以下、文長を$l$、中間層の次元を$d$、ミニバッチサイズを$b$とします。 実装はmusyoku/chainer-sruです。 Simple Recurrent Unit(SRU) SRUの各ゲートの更新式は以下の通りです。 \[\begin{align} \boldsymbol{\tilde{x}}_t &= \boldsymbol{W}\boldsymbol{x}_t\\ \boldsymbol{f}_t &= \sigma(\boldsymbol{W}_f\boldsymbol{x}_t +
概要 Quasi-Recurrent Neural Networksを読んだ Chainerで実装した はじめに Quasi-Recurrent Neural Networks(以下QRNN)は、RNNの機構をCNNで模したモデルです。 QRNNは半年前の論文ですので、ネットにはすでに解説記事がいくつかあります。 そのためこの記事では実装面について書いていきます。 またQRNNの論文著者らはChainerで実装しており、MetaMindのブログにコードが一部載っています。 私の実装はmusyoku/chainer-qrnnです。 1-D Convolution QRNNのCNNは1次元のCNNを用います。 QRNNの入力は単語の埋め込みベクトルを時系列に並べたものになっています。 埋め込みベクトルの次元数がチャネル数になります。 word2vecなどで200次元に埋め込んだ場合、チャネル数
概要 Chainerの小ネタ 追記(2017/10/16) 新しいバージョンを作りました。 はじめに Chainerでネットワークを設計する時は、ChainにLinkを追加して__call__で各層の出力を設計すると思います。 コードで書くとこんな感じです。(わざと巨大なネットワークにしています) class Chain(chainer.Chain): def __init__(self): super(Chain, self).__init__() with self.init_scope(): self.l1 = L.Linear(None, 1024) self.l2 = L.Linear(None, 512) self.l3 = L.Linear(None, 256) self.l4 = L.Linear(None, 128) self.l5 = L.Linear(None, 10
概要 Connectionist Temporal Classificationを読んだ 利用する際の注意点など はじめに 最近ChainerでConnectionist Temporal Classification(以下CTC)を使い始めたんですが、学習中にNaNが出てうまくいかなかったので、原因を調べるために論文と実装を読んだところ理解が深まったのでそのまとめです。 ちなみにNaNが出たのは使い方を誤っていたのが原因でした。 CTCについて まず用いる記号を論文に合わせて定義します。 ラベルの集合を$L$、blank(空白文字)を追加したラベル集合を$L’ = L \cup {blank}$とし、入力データ列を$\boldsymbol {\rm x} = {\boldsymbol x^1, \boldsymbol x^2, …, \boldsymbol x^T}$、対応する(soft
概要 ガウス過程に基づく連続空間トピックモデルを読んだ C++で実装した Doc2Vecとの比較など はじめに ガウス過程に基づく連続空間トピックモデル(以下CSTM)は、ガウス過程を用いて単語の確率を表すトピックモデルです。 実装はhttps://github.com/musyoku/cstmです。 gensimのDoc2Vecと比較し、その性質を調べました。 ちなみにガウス過程を知らなくても大丈夫です。 私はガウス過程やトピックモデルは初見なのですが普通に実装できました。 CSTMの考え方 CSTMでは、各単語$w$が$d$次元の潜在座標$\phi(w) \sim {\cal N}(\boldsymbol 0, I_d)$を持っていると仮定します。($I_d$は単位行列) つまり各単語は$d$次元のベクトルで表され、そのベクトルのそれぞれの要素は平均0、分散1の正規分布に従います。 次
概要 NPYLMの小ネタ はじめに 前回実装したNPYLMですが、実装上の問題点が1つあります。 それはForward filtering-Backward samplingで単語分割をサンプリングする際に、前向き確率$\alpha[t][k][j]$が$t>200$程度でアンダーフローを起こすために、長さ200文字を超える文を学習できないというものです。 実際に$t>200$付近の値を見てみると、 alpha[205][15][7] = 2.02827e-311 alpha[205][15][8] = 3.98249e-311 alpha[205][15][9] = 3.9813e-310 alpha[205][15][10] = 7.44059e-310 alpha[205][15][11] = 1.23668e-309 alpha[205][15][12] = 6.73723e-30
Boundary Equilibrium Generative Adversarial Networks [arXiv:1703.10717] 概要 BEGAN: Boundary Equilibrium Generative Adversarial Networksを読んだ Chainerで実装した はじめに BEGANはオートエンコーダベースのGANをWasserstein距離を用いて学習します。 ネットワーク構造はEnergy Based GANsと同じです。 実装はhttps://github.com/musyoku/beganです。 提案手法 BEGANのDiscriminatorはオートエンコーダになっており、データの復号誤差を考えます。 普通はこの復号誤差を小さくしたりするのですが、BEGANではこの復号誤差が何らかの確率分布に従っていると考え、本物のデータの復号誤差(の分布
概要 ChainerでPixel Shufflerを実装した はじめに 昨年にTwitter社が発表した超解像の論文を読んでいたところ、画像の拡大によく用いられるDeconvolutionを使わず、Pixel Shufflerと呼ばれる仕組みを利用して超解像を行っており、気になったので調べました。 Pixel ShufflerはReal-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Networkで提案されたもので(正式にはSub-Pixel Convolution)、入力特徴マップの各ピクセルを並べ替えて高解像度な特徴マップを出力します。 今回はDCGANのGeneratorをDeconvolutionとPixel Shufflerの両方で構成し
実装した論文やツールなど。 実装難易度は10段階です。記載がないものは容易に実装できます。 Chainer chainer.nn ChainerのChainをもっと書きやすくするために作りました Deep Learning Training RNNs as Fast as CNNs Simple Recurrent Unit RNNの高速な実装です LSTMに比べて10倍程度速いです Self-Normalizing Neural Networks 出力が自動的に正規化される活性化関数です 効く場合と効かない場合があります Learning Discrete Representations via Information Maximizing Self Augmented Training Regularized Information MaximizationとVirtual Adver
概要 Adversarial Autoencoders を読んだ Chainer 1.12で実装した はじめに 前回Adversarial AutoEncoderの記事を書きましたが、あれから3ヶ月後に論文が更新され、半教師あり学習への応用などの項目が追加されていました。 そこでChainer 1.12で実装し実験を行いました。 コードはGitHubにあります。 以下の説明は全てこのコードを元に行います。 またAdversarial AutoEncoderをこれ以降AAEと呼びます。 Adversarial Regularization 論文2.3節では隠れ変数$\boldsymbol z$をラベルデータを用いて正則化する方法について書かれています。 コードはsupervised/regularize_zにあります。 学習させると以下のように狙った箇所に隠れ変数を押し込めます。 Super
Learning Discrete Representations via Information Maximizing Self Augmented Training [arXiv:1702.08720] 概要 Learning Discrete Representations via Information Maximizing Self Augmented Trainingを読んだ Chainerで実装した はじめに Information Maximizing Self Augmented Training(以下IMSAT)は、Regularized Information Maximization(以下RIM)による学習と、data augmentationを用いて予測分布を滑らかにする学習の2つを同時に使ってクラスタリングを行う手法です。 MNISTを教師なしで98%分類できる
Least Squares Generative Adversarial Networks [arXiv:1611.04076] 概要 Least Squares Generative Adversarial Networksを読んだ Chainerで実装した はじめに Least Squares GAN(以下LSGAN)は正解ラベルに対する二乗誤差を用いる学習手法を提案しています。 論文の生成画像例を見ると、データセットをそのまま貼り付けているかのようなリアルな画像が生成されていたので興味を持ちました。 実装は非常に簡単です。 目的関数 LSGANの目的関数は以下のようになっています。 \[\begin{align} \min_D {\cal J}(D) &= \frac{1}{2}\double E_{\boldsymbol x \sim p_{\rm data}(\boldsymbo
概要 The Infinite Hidden Markov Modelを読んだ C++で実装した はじめに Infinite Hidden Markov Model(以下IHMM)は、隠れマルコフモデル(HMM)の状態数をデータから決定することができるモデルです。 HMMにおける状態遷移確率をディリクレ過程によって生成することで無限の状態数を扱います。 それぞれの状態からの遷移確率に共通の(離散的な)基底分布を与えることで現在の状態数を共有し、さらにこの基底分布の基底分布として連続分布を与えることで新しい状態を無限に生成することができます。 参考文献 最近のベイズ理論の進展と応用 (III) ノンパラメトリックベイズ IHMMによる「不思議の国のアリス」の学習例が載っています ノンパラメトリックベイズ法 続・わかりやすいパターン認識―教師なし学習入門― ディリクレ過程や隠れマルコフモデルの
概要 様々なモデルでMNISTの半教師あり学習(10ラベル)を行った はじめに 今までに作ってきた半教師あり学習の手法を用いてMNISTのワンショット学習対決を行ないました。 用いるモデルは以下の4つです。 GAN (Generative Adversarial Network) 通常の多クラス分類器をDiscriminatorとして使う手法を用いる MNIST 100ラベルのSOTA(エラー0.93%) Improved Techniques for Training GANs 実装 VAT (Virtual Adversarial Training) データ$x$の予測分布$p(y \mid x)$と、ノイズ$r$を加えた$\bar{x} = x + r$の予測分布$p(y \mid \bar{x})$が滑らかになるように学習 最も予測分布を狂わすノイズ$r_{adv}$を誤差逆伝播で
概要 Wasserstein GANを読んだ Chainerで実装した はじめに Wasserstein GAN(以下WGAN)はEarth Mover’s Distance(またはWasserstein Distance)を最小化する全く新しいGANの学習方法を提案しています。 実装にあたって事前知識は不要です。 私はEarth Mover’s Distance(EDM)などを事前に調べておきましたが実装に関係ありませんでした。 またRedditのWGANのスレッドにて、GANの考案者であるIan Goodfellow氏や本論文の著者Martin Arjovsky氏が活発に議論を交わしています。 Martin Arjovsky氏の実装がGithubで公開されていますので実装には困らないと思います。 私はChainer 1.20で実装しました。 https://github.com/mus
概要 NVIDIA SHIELD Android TVにUbuntu 14.04を入れた Chainerを動かしてみた 2万円でJetson TX1とほぼ同等な開発環境を構築した はじめに 半精度(fp16)で1TFLOPSの演算性能があるモバイル向けGPUのNVIDIA Tegra X1が昨年リリースされ、その開発環境としてJetson TX1が日本でも今年3月にようやく発売されました。 Jetson TX1はUbuntuをOSとして利用しており、インターフェースも多く自由度の高い開発が行えるのですが、米国価格$599が例によって日本円で10万円前後という簡単には手の出せない値段になっています。 (さらに米Amazonでは購入不可) しかしTegra X1自体は他のNVIDIA製品にも組み込まれており、その中でもSHIELD Android TVは$199(米Amazonで23,000円
概要 Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networksを読んだ Chainer 1.17で実装した(→GitHub) はじめに Weight Normalizationは、ニューラルネットの重みベクトル$\boldsymbol w$を \[\begin{align} \boldsymbol w=\frac{g}{\mid\mid \boldsymbol v \mid\mid}\boldsymbol v \end{align}\\] のように、ベクトル$\boldsymbol v$とスカラー$g$に分解します。 また、これらのパラメータで誤差関数$L$を微分した時の勾配はそれぞれ \[\begin{align} \nabla_gL &= \frac{
概要 Unrolled Generative Adversarial Networksを読んだ Chainerで実装した はじめに Unrolled GANはGeneratorの安定性を高め、”mode collapse”を回避するための手法です。 Discriminatorに関しては何もしません。 実装も非常にシンプルです。 Unrolling GANs Generatorのパラメータを$\theta_G$、Discriminatorのパラメータを$\theta_D$とします。 またGANの目的関数はよく使われる以下を用います。 \[\begin{align} f(\theta_G, \theta_D) &= \double E_{x \sim p_{data}} \left[{\rm log}(D(x;\theta_D)) \right]+ \double E_{z \sim {\ca
概要 Improved Techniques for Training GANsを読んだ Chainer 1.18で実装した アニメ顔画像を学習させた MNISTの半教師あり学習を実験した はじめに この論文はGANによる画像生成と半教師あり学習の2つに焦点を当て、新たな学習テクニックを提案したものです。 この記事ではそのテクニックの中からfeature matchingとminibatch discriminationを実装します。 さらに多クラス分類器をDiscriminatorとして使うテクニックを用いてMNISTの半教師あり学習を行ないます。 以下、訓練データを$x$、Generatorが生成したデータを$\bar{x}$とします。 またDiscriminatorを$D(x)$、ノイズ$z$から$\bar{x}$を生成するGeneratorを$G(z)$と表記します。 GANでは$
概要 NPYLMでワードクラウドを作る ワードクラウドとは Twitterで以下のような投稿を見たことがあるかもしれません。 これはワードクラウドと呼ばれるもので、クロクモなどのwebサービスで作ることができます。 ワードクラウドは頻出語をその頻度に応じたサイズで並べることで分かりやすく可視化することができますが、こういったwebサービスは基本的には可視化部分をamueller氏のword_cloudで行い、頻出語のカウントにはMeCabを用いた形態素解析により行っています。 教師なし形態素解析とは MeCabによる形態素解析は基本的に単語辞書を用いて行われます。 それに対し教師なし形態素解析は与えられた文字列の集合からMCMCと動的計画法によりNPYLMと呼ばれる言語モデルを学習し、得られたモデルをもとに文を単語に分割することができます。 特徴としてどのような文字列からも単語を推定するこ
Distributional Smoothing with Virtual Adversarial Training [arXiv:1507.00677] 概要 Distributional Smoothing with Virtual Adversarial Trainingを読んだ Chainer 1.18で実装した はじめに 提案手法(以下VAT)は、予測分布$p(y \mid x)$を最も狂わすノイズ$r_{v-adv}$を計算により求め、$p(y \mid x + r_{v-adv})$を$p(y \mid x)$に近づけることでモデルの頑健性を高める手法です。 Adversarial Trainingの流れを汲む手法ですので、まずAdversarial Trainingについて簡単に説明します。 Adversarial Training (https://arxiv.org/a
概要 Adversarial Autoencoders を読んだ Chainerで実装した はじめに Adversarial Autoencoderは、通常のオートエンコーダの中間層出力ベクトル$\boldsymbol z$に対し、Generative Adversarial Networksの枠組みで正則化を行うオートエンコーダです。 GAN (Generative Adversarial Networks) GANではまず任意のノイズ分布$p_z(\boldsymbol z)$を考え、そこからサンプリングしたノイズ$\boldsymbol z$から偽のデータ$\boldsymbol x_{gen}$を生成する関数$G(\boldsymbol z)$をニューラルネットで定義します。 次に任意のデータ$\boldsymbol x$に対し、それが訓練データ由来の本物のデータ$\boldsym
Categorical Reparameterization with Gumbel-Softmax [arXiv:1611.01144] 概要 Categorical Reparameterization with Gumbel-Softmax を読んだ Auxiliary Deep Generative Modelsに組み込んで実験した はじめに Deep Learningなどでクラス分類を行う場合、カテゴリカル分布と呼ばれる分布を用いて属するクラスの確率を求めると思います。 たとえばMNISTであれば10個のクラスを用意し、10次元の出力ベクトルをsoftmax関数に通すことでカテゴリカル分布を作ります。 上の画像はクラス数が6個の場合の分布の例です。 この分布からサンプリングを行うとクラスを得ることができます。 Deep Learningではクラスを表す変数をスカラーではなくone
概要 Chainerのネットワーク構造をKerasのように書きたい 構造を保存したい はじめに KerasというDeep Learningフレームワークがあります。 Kerasではレイヤーを以下のように作ることができます。 from keras.layers import Dense, Activation model.add(Dense(output_dim=64, input_dim=100)) model.add(Activation("relu")) model.add(Dense(output_dim=10)) model.add(Activation("softmax")) 上から順にデータが流れていくので非常にわかりやすいですね。 Chainerでも同等のことはできなくもないのですが、ネットワーク構造をハードコーディングする必要があります。 それの何が問題かというと、様々なハ
概要 Auxiliary Deep Generative Models を読んだ Chainer 1.12でADGMとSDGMを実装した はじめに Auxiliary Deep Generative Models(ADGM)は半教師ありのMNISTのクラス分類(100 labels)において、現在世界最高精度のエラー率0.96%を達成したモデルです。 私のChainer実装はGitHubで公開しています。 また著者自身によるLasagne実装が公開されていますので、試したい方はそちらを利用することもできます。 モデル ADGMはVAEに補助変数$a$を入れて拡張したものになっています。 VAEのM1+M2と同じくADGMも隠れ変数は2つ($\boldsymbol z$と$\boldsymbol a$)ですが、依存関係が大きく異なっています。 ADGMでは生成モデルと推論モデルはそれぞれ \
Semi-Supervised Learning with Deep Generative Models [arXiv:1406.5298] 概要 Semi-Supervised Learning with Deep Generative Models を読んだ Chainer 1.8で実装した モデルM1、M2、M1+M2の実装方法の解説 モデルM2で100ラベルのエラー率9%を達成した モデルM1+M2で100ラベルのエラー率4%を達成した はじめに Variational AutoEncoder(VAE)は、半教師あり学習に用いることのできるオートエンコーダです。 学習のベースとなる確率的勾配変分ベイズ(SGVB)については以前の記事をお読みください。 この論文では3つのVAEのモデル、M1、M2、M1+M2が提案されています。 M1 M1は教師なし学習のためのモデルです。 Chai
概要 Auto-Encoding Variational Bayes を読んだ はじめに 最近名前をよく聞くようになった変分オートエンコーダ(Variational AutoEncoder)の基礎となる確率的勾配変分ベイズ(SGVB)について自分なりにまとめます。 参考 20150717-suzuki.pdf SGVB vb-nlp-tutorial.pdf 変分下限 問題設定 データを$\boldsymbol x$、隠れ変数を$\boldsymbol z$、パラメータを$\boldsymbol \theta$とし、同時確率分布$p_{\boldsymbol \theta}(\boldsymbol x, \boldsymbol z) = p_{\boldsymbol \theta}(\boldsymbol x\mid\boldsymbol z)p_{\boldsymbol \theta}(
次のページ
このページを最初にブックマークしてみませんか?
『ご注文は機械学習ですか?』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く