2015年まとめ
2015年目標(2015/1/11)のつづき。今年ももう終わりということで目標に対する振り返り。今年は4つ目標を立てていた。
(1) Deep Learningの勉強 ◎
Deep Learningの勉強・研究は今年から本格的に始めた。主にDeep Learning Tutorialを読み、Theanoで実装しながら基本的なアルゴリズムを理解することに集中した。ロジスティック回帰、多層パーセプトロン、畳み込みニューラルネットワーク、自己符号化器、制約ボルツマンマシン、Deep Belief Networkあたりまで教科書に載っているような手法はだいたい理解できた。話題のTensorFlowは来年かな?
あとはこの二冊を熟読した。基礎は一通り抑えたのでこれで最新の論文も読めるようになるかな?
- 作者: 岡谷貴之
- 出版社/メーカー: 講談社
- 発売日: 2015/04/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
- 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
- 出版社/メーカー: 近代科学社
- 発売日: 2015/11/05
- メディア: 単行本
- この商品を含むブログ (1件) を見る
(2) Pythonによるモンテカルロ法入門 △
Pythonによるモンテカルロ法の実装はやらなかった。ただ、制約ボルツマンマシンの理解にMCMCが必要になりアルゴリズムは抑えたので△。
(3) pandasとscikit-learnの習得と活用 ○
Pythonのデータ分析ライブラリpandasと機械学習ライブラリscikit-learnは使えるようになった。scikit-learnに関してはSciPy2015のチュートリアルを参考に4つ記事を書いた。
(4) 複雑系の勉強 ×
複雑系の勉強は残念ながらやらなかった。Deep Learningの方で手一杯だった。
(5) その他
統計的声質変換
Pythonで音声信号処理(2011/5/14)の応用の一環として統計的声質変換の実験をした。音声の扱い方がわかってきた。
ベイズ推定とグラフィカルモデル:コンピュータビジョン基礎
機械学習とコンピュータビジョンの勉強のためにComputer vision: models, learning and inferenceを読み始めた。テキストは無料で手に入る。あと玉木先生がYoutubeで講義を配信している。PRMLよりわかりやすい。これもまだ途中なので来年も続けたい。
Synapses, Neurons and Brains
人工知能学会誌の脳神経系シミュレーションの特集をよりよく理解するためCourseraで Synapses, Neurons and Brains という神経科学の講義を受講した。ニューロンの発火の仕組みから脳シミュレーションまで。Idan Segev教授の説明が非常に熱心だったのが印象に残った。でも試験はすごく細かくてものすごーくイライラした(笑)この講義内容に関してはTwitterでときおりつぶやいただけでブログには全くまとめていなかった。Twitterはあとから見直しにくいから少し問題だな。
読んだ or 読んでいる本
今年(じゃないのもあるけど)は人工知能に関する本が豊作だったのでいくつか読んだ。
- 作者: 松尾豊
- 出版社/メーカー: KADOKAWA / 中経出版
- 発売日: 2015/03/10
- メディア: Kindle版
- この商品を含むブログ (24件) を見る
- 作者: 小林雅一
- 出版社/メーカー: 講談社
- 発売日: 2015/03/20
- メディア: Kindle版
- この商品を含むブログ (10件) を見る
- 作者: ジェイムズ・バラット
- 出版社/メーカー: ダイヤモンド社
- 発売日: 2015/06/22
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
- 作者: ジョージザルカダキス
- 出版社/メーカー: 日経BP社
- 発売日: 2015/09/16
- メディア: Kindle版
- この商品を含むブログを見る
The Quest for Artificial Intelligence
- 作者: Nils J. Nilsson
- 出版社/メーカー: Cambridge University Press
- 発売日: 2009/10/30
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: ミチオ・カク
- 出版社/メーカー: NHK出版
- 発売日: 2015/02/27
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: マイケル・S.ガザニガ,Michael S. Gazzaniga,藤井留美
- 出版社/メーカー: 紀伊國屋書店
- 発売日: 2014/08/28
- メディア: 単行本
- この商品を含むブログ (9件) を見る
- 作者: クリストフ・コッホ,土谷尚嗣,小畑史哉
- 出版社/メーカー: 岩波書店
- 発売日: 2014/08/07
- メディア: 単行本
- この商品を含むブログ (8件) を見る
今年はKindle Paperwhiteを買ったこともあって電子書籍を頻繁に買うようになったのが大きな変化かな。著作権が切れて大安売りしている吉川英治の歴史小説(三国志、新水滸伝、新平家物語、私本太平記、新書太閤記、宮本武蔵)に無茶苦茶はまっていた。
最後に
- 出版社/メーカー: ベセスダ・ソフトワークス
- 発売日: 2015/12/17
- メディア: DVD-ROM
- この商品を含むブログ (3件) を見る
人工知能によるコンテンツ生成と著作権
今朝の読売新聞に面白い記事があったのでご紹介。
AI芸術著作権は?
人工知能(AI)が自動的に作った楽曲や小説は「誰の作品」になるのか。政府は「AIアート」が将来、本格的に普及するとみて、 年明けから著作権のあり方について議論を始める。 そもそも著作権を認めるべきなのか、「これはこのAIの作品だ」ということをどう証明するのかなど、 整備すべきルールは多岐にわたる。
読売新聞 2015年12月30日
この記事では人工知能芸術の事例として
- 短編小説生成システム「きまぐれ人工知能プロジェクト 作家ですのよ」
- 自動作曲システム「Orpheus」
の2つが取り上げられている。このような人工知能システムで作ったコンテンツの著作権はどうなるのか?というお話だった。著作権は作者の死後50年間とされているが、人工知能は死なないので保護期間が問題になるそうだ。システム(サービス)停止から50年でいいのでは?と直感的に思ったけれど、システムを公開しないでゴーストライターみたいな使い方をするケースの方が多そうなのでやはり難しい問題か・・・ちなみに現状の法体系では、著作物を「思想または感情を創作的に表現したもの」と定義しているため思想や感情を持たない人工知能が生成したものが著作物として認められる可能性は低いとのことらしい。
生成したコンテンツの著作権以前に人工知能システムを学習するのに用いた著作物の扱いがどうなっているのかが気になる。現状のコンテンツ生成手法は、既存のコンテンツ(テキスト、画像、音楽)から何らかの"特徴"を学習して、学習したモデルから新しいコンテンツを生成するタイプが多いと推測している。人間も既存コンテンツを参考に新しいものを創造することが多いけれど、人工知能が既存コンテンツを"参考にする"ことはどこまで許されるのだろうか?
法律に関してはほとんど無知なのでちょっと調べてみたが、著作権法の47条に情報解析目的なら著作物を自由に使ってよいとあった。
(情報解析のための複製等) 第四十七条の七 著作物は、電子計算機による情報解析(多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の統計的な解析を行うことをいう。以下この条において同じ。)を行うことを目的とする場合には、必要と認められる限度において、記録媒体への記録又は翻案(これにより創作した二次的著作物の記録を含む。)を行うことができる。ただし、情報解析を行う者の用に供するために作成されたデータベースの著作物については、この限りでない。
じゃあWebから集めたテキスト・画像・動画・音声・音楽を人工知能に与える訓練データとして使う場合は「情報解析」に当たるとみなしてOKってことだろうか?そこから新しいコンテンツを生成して自分が作ったと発表してもOKなのだろうか? 具体例がなく「その他の統計的な解析」、「必要と認められる限度」のような曖昧な表現があってどこまでOKなのかこれではわからない・・・ここら辺の議論はもう決着しているのかな?
先の記事で取り上げられたシステム以外にも人工知能によるコンテンツ生成に関する技術は近年盛んに研究されていて個人的にすごく興味を持っている。流行りのDeep Learningが多いけれど、Darwin Tunesのように遺伝的アルゴリズムが使われる例もある。来年はここら辺の技術をメインにとりあげていきたい。
- キャプションの自動生成 - 画像からテキストを生成
- 画像の自動生成 - Deep Convolutional Generative Adversarial Networks (DCGAN)
- イラストの自動生成 (1) - DCGAN
- イラストの自動生成 (2) - DCGAN
- 画風の変換 - A Neural Algorithm of Artistic Stlye
- 画風変換の解説 - Chainer-Gogh
- 楽曲の自動生成 - Recurrent Neural Networks
- 自動作曲サービス - Jukedeck、人工知能らしいが詳細な仕組みは不明
- メロディ進化 - Darwin Tunes、遺伝的アルゴリズム
Theanoによる雑音除去自己符号化器の実装
この記事はDeep Learning Advent Calendar 2015の9日目です。
Theanoによる自己符号化器の実装(2015/12/3)の続き。
今回は自己符号化器を継承して雑音除去自己符号化器(Denoising autoencoder)を実装した。
ソースコード全体はここ。
自己符号化器は入力をもとの入力に戻すような写像を学習する手法だったが、雑音除去自己符号化器はもっと過酷で雑音(ノイズ)を付与した入力を雑音のない状態に戻せという一見すると無茶な要求を最適化アルゴリズムにつきつける。MNISTの例だと左のようなノイズが入った画像(画像クリックで拡大)を右のようなノイズがない画像に戻す写像を学習させる。最適化アルゴリズムにこういう制約を課すだけでよりロバスト性の高い特徴が自動的に学習できるという。
ノイズ付与
ノイズ付与の方法はいろいろあるらしいがランダムにマスキングする手法が一般的なようだ。おそらく、何らかの統計的な傾向があるノイズでないと復元できないと思われる。Deep Learning Tutorialではget_corrupted_input()
という汚(よご)した画像のシンボルを返すメソッドを定義している。input
が(ミニバッチ単位の)画像セットを表すシンボルでこのメソッドの戻り値が汚れた画像セットを表すシンボル。
def get_corrupted_input(self, input, corruption_level): return self.theano_rng.binomial(size=input.shape, n=1, p=1-corruption_level, dtype=theano.config.floatX) * input
ここでは二項分布(binomial)に従うサンプルを画像と同じサイズだけ生成し、それを画像(input)にかけている。二項分布であるが試行回数nが1なのでいわゆるベルヌーイ分布である。これがなぜノイズ付与になるかは下のようなサンプルを書けば理解できる。ここでは画像のサイズが10x10ピクセルと想定している。
#coding:utf-8 import numpy as np import theano from theano.tensor.shared_randomstreams import RandomStreams rng = np.random.RandomState(123) theano_rng = RandomStreams(rng.randint(2 ** 30)) # 二項分布のサンプルを生成 corruption_level = 0.5 binomial = theano.function([], theano_rng.binomial(size=(10, 10), n=1, p=1-corruption_level)) print binomial()
corruption_level = 0
、つまりまったく汚さないとすると
[[1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1]]
が出力される。画像の各ピクセルに1をかけるのでそのままの画像が出力される。次にcorruption_level = 1
、つまり最大限汚すと
[[0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0]]
が出力される。画像の各ピクセルに0をかけるので画像の全ピクセルが0になり真っ黒な画像になってしまう。corruption_level = 0.5
とすると
[[0 1 0 1 1 1 1 1 0 1] [0 0 0 1 1 1 0 0 1 0] [0 0 1 0 1 1 1 0 1 0] [1 1 1 1 1 1 0 1 0 0] [1 0 1 0 1 1 1 1 1 1] [1 0 1 0 1 1 1 1 0 1] [0 0 1 1 1 1 1 0 0 0] [0 1 0 0 1 0 0 0 1 0] [1 0 0 1 1 0 0 0 1 0] [0 1 0 1 0 1 0 0 0 0]]
となり、0と1が大体半分ずつ出現する。画像の各ピクセルにかけると0のところだけ黒く塗りつぶされノイズになるというわけか。実験では corruption_level = 0.3
としているため大体30%のピクセルが黒く塗りつぶされることになる。
コスト関数
雑音除去自己符号化器はコスト関数が少しだけ違う。ポイントは2つ。
- ニューラルネットに入力する前に画像にノイズを付与する
- 誤差はノイズを付与する前の画像との間で計算する
この誤差が小さくなるように重みを学習するためうまく学習できればノイズを付与した画像を入れるとノイズを付与する前の画像が出力されるというわけ。
def get_cost_updates(self, corruption_level, learning_rate): """コスト関数と更新式のシンボルを返す""" # 入力の一部にノイズを付与して汚す tilde_x = self.get_corrupted_input(self.x, corruption_level) # 入力を変換 y = self.get_hidden_values(tilde_x) # 変換した値を逆変換で入力に戻す z = self.get_reconstructed_input(y) # コスト関数のシンボル # 汚した入力が汚す前の入力に近くなるように学習する L = - T.sum(self.x * T.log(z) + (1 - self.x) * T.log(1 - z), axis=1) # Lはミニバッチの各サンプルの交差エントロピー誤差なので全サンプルで平均を取る cost = T.mean(L) # 誤差関数の微分 gparams = T.grad(cost, self.params) # 更新式のシンボル updates = [(param, param - learning_rate * gparam) for param, gparam in zip(self.params, gparams)] return cost, updates
重みの可視化
自己符号化器と雑音除去自己符号化器で学習された重みを可視化して比較してみた。左が自己符号化器の重みで右が今回の雑音除去自己符号化器の重みである。重みを描画するコードは前回(2015/12/3)とほとんど同じなので省略。
重みの傾向が異なることはわかったけれどこれだけじゃロバストな特徴かはわからないかな。あとで学習した特徴を用いて数字認識するがそこで精度に差が出ることでロバスト性が示せるようだ。
入力画像の再構築
最後に前回と同様に入力画像を再構築してみよう。上が自己符号化器に入れて再構築した場合、下が雑音除去自己符号化器に入れて再構築した場合である。隠れ層のユニット数はどちらも500である。
雑音除去の方がよりクリアに再現されることがわかる。これは予想できたことでノイズの黒いところを白く補正する傾向が強くなったためだと考えられる。描画用のコードはこちら。
Deep Learning Tutorialでは画像の例しかないけれど、ノイズを工夫すれば自然言語や音声など他のドメインでも応用できるのか気になった。自然言語のノイズというとタイポとかかな?音声は普通に雑「音」なのでわかりやすい。音声の雑音除去は興味があるので余裕があったら試してみたい。
次回は積層自己符号化器(Stacked autoencoder)を実装する。ようやくDeepになる!
参考
- Denoising Autoencoders (dA)
- Vincent, H. Larochelle Y. Bengio and P.A. Manzagol, Extracting and Composing Robust Features with Denoising Autoencoders, Proceedings of the Twenty-fifth International Conference on Machine Learning (ICML‘08), pages 1096 - 1103, ACM, 2008.
- Theano でDeep Learning <4> : Denoising オートエンコーダ