人工知能

人工知能を作ってみよう、という無謀な挑戦のコーナー

全くの初心者からの機械学習ロードマップ

この記事はKCSアドベントカレンダー第15日目の記事です!

おはござー!おはござー!おはござー🌻!

ぼく(リンク先:Twitter)自身の記事としてはおよそ1.5年ぶりとなります.12月も中程に差し掛かり学部3年ということもあって研究室選定で右往左往しております.

何かしら技術系の記事を書こうと思っておりましたが,そのネタはコミケ95での部誌に回すとしてここでは自分の1年間の自分語りにしようかと思います.オタク,自分語りしがち.

KCSはいくつかの班に分かれて活動しているのですが,ぼくはAI班とBlender班で主な活動を続けておりました.AI班自体の発足は結構前からあるようですが,ぼく自体がAI班に入ったのは今年度に入ってからですので,おおよそ9ヶ月程度の機械学習を学び始めてから経つことになります.

9ヶ月前までは二進も三進もわからなかった状態から,どのように機械学習の勉強を続けていったのか,その過程を共有することで,同様の立場にいるような人(いるのか?)の助けになれば幸いです.

図です

機械学習関連以外のことは灰色で示しました.

勿体ぶる必要もないので時系列順にやったこととその感想とかを紹介します.

3-4月 Python機械学習プログラミング

81kHmZ62+nL

Amazon

まず第一に,技術書を買った際に自分の手ですべて実装することを目標にしました.何かしらの言語を学ぶ際に,何に応用できるのか,これを覚えて何になるかといった視野を持つことにしています.C++を学ぶ際,クラスやオブジェクト指向,C++11のshared_ptrといったとっつきにくい概念から,どのように実活用されるかなどが全く把握できず仕舞でせっかくのプログラミングに対してやる気が全く出ずに,そのうち習慣が自然消滅してしまうといったことが多々あります.ぼくの場合には「機械学習」を学び「Webアプリケーション」を作りたい.スキルを活かせる「バイト」をしたい等,の目標を定めました.

この本では,機械学習で使われるSVMだとかK-meansだとかのアルゴリズムをある程度網羅的に,なおかつコード量も豊富に記載されており,Pythonと統計学,機械学習を万遍無く学べる良い本でした.無から有を生み出せそうな良書です.

また,TwitterのFF内間で日報/日記を付けるムーブメントが流行っているように見えたことから便乗して,ぼく自身もこの時期から日記/ブログをつけ始めることにしました.

進捗だめです

他人に見せるという体で学んだことをまとめ上げるという行為は,

  • 知識を言語化することで学習の反芻を行え,知識の定着が向上する
  • 他人に見せるための文章を書くことで,自己完結しない知識の表現方法を行える
  • 他人からも「○○ちゃんのブログは為になるなぁ!」とかレスポンスが貰えて習慣化が期待できる

といった役に立つことが盛り沢山だとおもいます.なのでこれを見ている皆さんも日記を付けてください.付けなさい!付けろ!!!

3-5月 Coursera

皆さんはCourseraというサイトを御存知でしょうか.

 

…では,AIdemyという動画教材による学習サービスサイトは聞いたことはありますでしょうか.

 

おそらくAidemyなら聞いたことがあるという方が多いのではないのでしょうか.

国内では個人的にはあまり聞かないの(僕主観ではの話を国家レベルに拡大するな)ですが,動画で学習ができて,なおかつ,時たま出されるプログラミング課題に回答して,全講座を終了させることで,修了証を貰えてLinkedIn等のサイトそれを貼ることで俺ツエーできる様になるというサイトです.動画講座自体は無料で閲覧することが可能であり,実際に演習を行うという場合でも月間6000円弱でコース内の全教材が利用可能となります.

同期で同じクラスのモヤシ炒め界の申し子でUCDavisのK氏がやってたことに便乗してAdvanced Machine Learning Specialization という全40週弱ある講座を申し込みました.しかし,大学が始まった事による忙しさの変化により,思うように進められなくなってしまったため途中で断念しています.しかしながら,機械学習の実力(と,あわよくば英語力)を身につけるには最適な教材です.一回の動画が10分前後で終わるため,空いた時間を有効的に活用ができ,講座数も豊富です.機械学習以外でも制御工学WebデザインVR開発まで非常に多岐にわたります.なかには大学のDegreeなどをも得られるような本格的な講義まであります.

Courseraに関する記事は,上のK氏もロ技研のアドベントカレンダーにて学習方法等を共有しています.細かい学習方法など,具体的な環境の揃え方などに興味がある方はこの記事を参考にしてみてください.

4-7,9-11月 Ian Goodfellowの深層学習邦訳版

61zJusXfyjL._SX258_BO1,204,203,200_

2018年度は,KCSの方針で週に2度ほど集まって,片方はゼロから作るを頭から読んでいく会(初級者向け)と,Ian Goodfellowの深層学習や各種論文を読んでいく会(上級者向け)を開催していました.

前者の方はおおよそ無難な結果で終わることができたのですが,後者の方は読み込み始めてからこの本が上級者向けなどではなく人智を超越した神とそれに匹敵する最強GAN制作おにいさんしか理解できないような代物であることに気付きました.

 

平平凡凡である僕は開いては悶え開いては悶えを繰り返し,全く先に進めずじまいでした.(げに今もそうなのですが.)しかし,間違いなく知識の得られる量としては日本語文献では抜群に豊富のような気がするため,これを理解さえできればおおよその深層学習の基礎については分かったと言い張れるだろうという自信がつきます(ということにしておきます).

4-7月 ゼロから作るDeep Learning ①

picture_large978-4-87311-758-4

内容に関する評価は10万部のセラーを記録したため探せばいくらでも出てくるため文が拙い僕が書くのもアレなので省略します.

KCSでは毎年(といっても先輩いわく2015年ごろからの習慣で)新入生向けの講習会を4-6月にかけて開催しています.その講習会の教材として活用しました.

実装レベルから,Adam等のオプティマイザの説明,CNNの構造まで詳しく説明されており,説明も概ね分かりやすかったです.次年度以降のAI班の活動方針は僕の手中でもないので知る由もないのですが,もし「教科書を作る」となった場合には非常に参考になるのではないか.というような良書です.

8-9月 パターン認識と機械学習

    その日、人類は思い出した。
    ベイズに凌辱されていた恐怖を。
    頻度論の中に囚われていた屈辱を。

    Seid ihr Frequenztheorie? Nein, wir sind der Bayesian!

ベイズに凌辱されました.

日記に日記とは思えない分量を書いたりしたので読んでください.

変分ベイズ(1) 変分ベイズ(2) 多項式回帰(1) 多項式回帰(2)

通年 論文輪読

KCSでは,学習の一環として,有志が集まって自分が読んできた論文をプレゼンにまとめて,知見を共有する回を行っています.

論文を読むことで,最新の知識を入手でき,多くこなしていくことで,論文の書き方や構成といったものがだいたい把握できて,将来の修論だとかを書く際に非常に参考になります.最新鋭の論文でも,Github等に本人の実装や他人による追実装等が挙げられており,写経するといっただけでも応用事例を実際にプログラムでき,最新鋭のアルゴリズムを手元のマシンで再現できるというのは,非常にモチベーションの向上につながるかと思います.

昨今,arXiv等には日に夥しい数の論文が投稿されています.その中から,読みたい論文を発見することは非常に困難だと思います.そこで,Twitter等を利用して他人の腕を借りて追いつくなど,周りの同士と共有して切磋琢磨できる環境を構築することは非常に重要となります.

これから

三田祭にて軽いWebアプリケーションを作った経験から,Web関連のことを学んでいこうかと思います.単一分野だけに留まらずに関連分野に目を向けて学習していきたいと思います.

また,KCS内でも本の輪読会を継続する声が上がっています.非常に嬉しいです.

リアルでも環境構築(特にデュアルディスプレイ)が重要なんだなと感じる一年であったとさ.完.

超解像の基礎


情報工学科3年、AI班班長の渡邉です。研究室の決定の際にメンタルがグワングワンしていましたが今は元気です。

今回は下級生の機械学習の実践として理解しやすく、結果もわかりやすい超解像の分野に関して、その初歩の部分の論文を簡単に解説していこうと思います。

超解像とは?

すごい簡単に言えば画質を上げるやつです。waifu2xなどは有名ですが、最近ではA.I.Gigapixelなどの商品も出てきているので、技術の進歩を感じますね。

最初の論文

機械学習が超解像の分野に用いられたのは2014年のImage Super-Resolution Using Deep Convolutional Networks.が最初だといわれています(確認してないので違ったら教えてください)
この論文内で採用されているモデルは3層と非常に浅く、損失関数は最小二乗誤差となっています。これを図や数式で示すと以下のようになります。尚、モデル図や損失関数の式は上の本論文から引用しています。
srcnn

$$
L(\Theta) = \frac{1}{n}\sum_{i=1}^{n}{|F(\boldsymbol{Y_i:\Theta)}-\boldsymbol{X_i}|}
$$
$$
\Theta = {W_i,W_2,W_3,B_1,B_2,B_3}
$$
このような今からだとチュートリアルにも思えるような簡単なモデルですが、PSNR(ピーク信号雑音比)という指標において既存手法を上回る性能を発揮しています。当時の既存手法と結果を比較したものが論文中に示されているのでこれも提示します。
SRCNN-result
このままだと何も違いが判りませんが、拡大するとわかりやすくなると思います。

そしてこの論文以降、機械学習を超解像に用いるのがブームになっていきました。

SRGAN

機械学習により超解像の分野にはある種ブレイクスルーが訪れたと考えられていましたが、最小二乗法を用いると、CNNで圧縮された値を最小化しようとするため、PSNRベースで見れば確かに雑音が小さいものが出力されますが、人間の視覚的にはあまりそれらしくないという状況が発生していました。これを解決する手法として用いられたのがGANです。要は、GANでは(うまくいけば)それらしいものを生成することができるので、これを使って超解像を行うことで、人間の目から見てそれっぽいものを作れるのではないかと考えられるようになり、実際にうまくいったものととして紹介されたのがPhoto-Realistic Single Image Super-Resolution Using a Generative Adversarial Network(2016)、通称SRGANです。この論文内では、新たな主な取り組みとしては、Pixelshuffler、Content loss、Adversarial lossの採用等が挙げられますが。次はこれらの解説を簡単に行おうと思います。

Pixelshuffler

通常のdeconvolutionでは、生成された画像が格子状になっている箇所があるものが比較的よくみられました。それは、画素ごとに参照回数に差があるためであり、実際にhttps://distill.pub/2016/deconv-checkerboard/にある動画を見てもらうと直感的にわかると思います。


そしてこれを解決するために用いられたのがPixelshufflerであり、Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Networkに初めて登場しています。これが、実際にはどのような操作を行っているのかというと、各チャネルの画素をその場に展開するという手法をとっています。言葉だけではわかりにくいので、元論文から画像を引用します。
pixelshuffler
画像が小さくなることを忘れていたので言葉でも頑張ってなるべくわかりやすくすることにします。convolution等を行った後のサイズが$$w\times h\times c^2$$であったときに、Pixelshufflerでは、これを$$wc\times hc\times 1$$として出力することで、deconvolutionに相当する操作を行っています。

Content loss

これは、style-transfer界隈から用いられたもので、各画素の値を比較するのではなく、学習済みのVGGに画像を流し、中間層での特徴量を比較することによって、鮮明な画像を出力することができるようにしたものです。数式としてはi番目のMaxPooling層の前のJ番目の畳み込み層(アクティベーション後)の特徴量などを逐次計算しています。(数式が入力できなかったのでこれで許してください、Hackmdで入力できたのになぜ)

Adversarial loss

GANの損失関数です。数式が入力できなくなった(添え字が複数段階つく数式などが表示できない)のでこれもほとんど通常のGANの損失関数と変化がないのでこれだけにしておきます。

SRGANのモデル

いろいろ書きましたが、結局SRGANのモデルは以下のようになっています。
SRGAN-models
また、損失関数に関しては、generatorはContent loss と Adversarial loss を1:0.001の割合で足し合わせて使用しているそうです。
では、SRGANがどの程度の性能を出すことができたのかを比較してみましょう。

SRGANの性能

元論文では、以下のような差が出たことが報告されています。
srganresultimage

確かに、SRGANの性能が他のSRCNN等と比較してよくなっていることがわかります。また、SRGANは特に人間が主観的に判断した際の美しさ(MOS)の値がよいことが知られており、それを示している結果は以下の画像の通りです。
srganresurltable2
尚、これらの画像において、SRGANのAdversarial lossを考慮しないものはSRResNetと呼ばれています。

最近の研究

これらの超解像の技術の進歩の結果、PSNRなどの数式で表すことができるような定量的な指標と、人間の主観で判断するMOSなどの定量的な指標の間にはトレードオフの関係があることがわかっており、どちらかに特化した手法が最近は開発される流れになってきています。具体的な例としては、SRGANの中のAdversarial lossのgenaratorの部分のlossに関しても考慮し、その中間層の特徴を生かすような構造を用いたSRFeatや、PSNRの向上に特化したRCANや、SRGANに対して、さらに他の手法で用いられた手法を取り込むことでさらにMOSの評価を上げたESRGANなどが開発されています。

所感

記事の冒頭にも書きましたが、このような分野の大きな利点は成果を実際に見て確認することができることだと思います。また、自分で記事を書いてみて、改めて基礎分野の重要性を感じました。
 

CNNについて

こんにちは。1年のhirotです。KCSでは主にAI班で活動しています。
と言っても、4月から12月にいたるまでに身に着けた知識はゼロに近く四捨五入したら初心者になるレベルですが…
しかし、今回はそんな僕が三田祭期間中に多少勉強したCNNの仕組みについて簡単に書いていきたいと思います。

★CNNとは

画像処理や音声認識など様々なところで使われるニューラルネットワークの一つです。主に「全結合層」「出力層」「畳み込み層」「プーリング層」の4層で構成されていて、これらを組み合わせることで処理を行えるという仕組みです。
例えば、「今持ってるたくさんの写真の動物が犬か猫か調べたい」という時に使用します。

★全結合層とは

1つの写真が持っている様々なデータをすべてまとめて扱いやすいように変換し、それにより得られたデータを活性化関数というもので差別化を行う層です。
例えれば、「この写真の動物の目と鼻と口は犬っぽい。だけど耳は猫っぽいなぁ」と識別します。

★出力層とは

全結合層で得られた結果を分析して、最終的な結果を出す層です。
例えれば、「犬成分の方が多い。だからこの動物は犬率75%だ」と出力します。

★畳み込み層とは

従来のニューラルネットワークは上の「全結合層」と「出力層」で構成されていました。しかし、ここで使われている「全結合層」にはデータをまとめる際に必要なデータを無くしてしまうという欠点があり、処理精度が高くありませんでした。
そこであらかじめ必要な情報を出しておくように改善され、その際用いられたのが「畳み込み層」です。

例えば、
ao
と表される画像があった時、
ak
畳み込みフィルタ-(特徴を浮かばせるもの)を通すと、
kk3.PNG

となり、出てきた緑色が特徴付けられた画像になります。
例えれば、「この動物は口が長くて、耳はピンと立っているな」と特徴を見つけます。

★プーリング層とは

取り扱っているデータの詳細情報を消去して、認識の幅を持たせる層です。
poo.PNG
このように1つの画像のある程度の範囲の最大値をとったり、平均化を行ったりします。
例えれば、「この動物の鼻に水滴がついてるけど、これは情報の一つにいれなくても平気だな」と考慮しなくていい情報を無くします。

★そして全部合わせてCNN

初めに述べたようにCNNはこれらの層を合わせて機能します。
順番は「畳み込み層→プーリング層」を何回か行った後、得たデータで「全結合層→出力層」となります。
とても大雑把な仕組みはこのような感じです。

★最後に

かなり雑になりましたが、CNNの仕組みについて書かせて頂きました。
Deeplearningに触れたことが無い人にも分かって頂けたら幸いです。
何か間違いがあったらすいません_(。。;)_

力学を使わないでハミルトニアン・モンテカルロ法を説明する

こんにちは。KCSアドベントカレンダー2018の12月9日の記事です。

https://adventar.org/calendars/3325

投稿者は数理科学科3年の鴨井です。僕のことを知らない人もいると思うので自己紹介をしておきます。僕は機械学習の勉強をしていて、2017年度のKCS副代表・AI班の代表でした。今は派遣留学で1年間カーネギー・メロン大学に留学をしています。主に自然言語処理、ベイズ学習、音声処理の勉強をしています。

記事は数式が書きやすいことと、単純にこのサイトの存在を忘れていたので自分のサイトに書きました。

https://ryokamoi.github.io/blog/tech/2018/12/09/hmc

記事の内容はハミルトニアン・モンテカルロ法というサンプリングの手法についてです。他の本などとは少し異なる方向性からの説明になっています。

ちなみに2018年12月9日は声優・水瀬いのりさんのファンクラブイベントの開催日でした。僕はアメリカにいるので参加できませんでした。とても悲しいです。水瀬いのりさんは1月23日に7thシングルを発売するので、よろしくお願いします。

https://www.inoriminase.com/

インスタ度判定Twitterアカウント@insta_san

今年はAI班で三田祭に向けてインスタっぽい画像を判定するアプリを作成しました。その名もインスタさんです。

インスタさんに画像を渡すと・・・

Screenshot from 2017-11-23 00-52-32

このように画像のインスタっぽさと、インスタっぽい部分が表示されます!
(三田祭期間中のみの運用予定なので、記事を閲覧しているときには動かないかもしれません、ごめんなさい!)

AIは@sesenosannko、Twitterの入出力は@mt_caretが作成しました。

しくみ

インスタさんのアイデアはとても簡単です。Instagramからたくさんの画像といいね数を集めてきて、いいね数が多い画像をインスタっぽい画像として学習させます。

ここで考えなくてはいけないことは、「いいね数が多いという基準」と「学習モデル」です

  • データセット

画像からインスタっぽさを学習するのは難しい課題なので、今回は単純に「インスタっぽい」画像と「インスタっぽくない」画像の二つに分類することにしました。単純にいいね数が多い画像と言ってもユーザーによってフォロワー数が違いますし、投稿した時点でのフォロワー数がわからないので、いいね数をそのまま使うことは難しいでしょう。

調査の結果、多くの人のアカウントでは投稿するたびにいいね数が徐々に増えていく傾向にあることが分かりました。しかし、人によって増加のタイミングや速度は様々で何かの関数で近似するのは難しそうだったので、単純に前後20投稿の平均いいね数よりもいいね数が多いか少ないかによって「インスタっぽい」画像と「インスタっぽくない」画像を分けることにしました

  • 学習モデル

近年は画像の分類にはCNNというディープラーニングのモデルが使われることが多いです。インスタさんもCNNを用いて学習しています。

今回は画像数が少ないこともあり、大量の画像で分類を学習した結果を活用して学習を行なっています。このような手法は転移学習と言われています。使用したモデルの詳しい説明は以下のサイトを参照してください。

https://www.tensorflow.org/tutorials/image_retraining

画像がインスタっぽいかという問題は人間でもはっきりと分けられないので、あまり良い学習ができることは期待できません。特に今回は学習セットの分け方も非常に単純で信頼性の低いものとなってしまっています。しかし、転移学習によって画像から意味のある情報を取り出して学習を行なっているため、何かを学習しているということは見て取れます。

LIME

インスタっぽい部分を出力するときに使用しているのはLocal Interpretable Model-Agnostic Explanations(LIME)という手法です。

簡単にいうと、入力画像の一部を隠した画像をたくさん作り、インスタ度が高かったときに隠されていなかった部分のインスタ度が高いと考える手法です。詳しくは以下のサイトを参照してください。

https://homes.cs.washington.edu/~marcotcr/blog/lime/

REINFORCE Algorithm でジャンプアクションを学習させてみた

こんにちは. TRSasasusu です.今回は前回に引き続き強化学習の話です.

スクリーンショット 2017-08-07 4.17.50

前回のQ学習は行動価値関数を更新していくことで学習を進めましたが,今回の REINFORCE Algorithm は直接方策を更新していくことで学習を進める方策勾配に基づくアルゴリズムの一種です.

方策勾配に基づく強化学習は状態空間や行動空間が連続であっても取り扱うことができます.ですが,なんとなく連続な状態空間における離散的な行動空間を持つ問題をやってみました.具体的には,ジャンプで穴を飛び越えることを学習していきます.ジャンプするのが早すぎてもタイミングが合わず落ちますし,ジャンプしなくてももちろん落ちます.行動はジャンプするかしないかで,横方向への移動に関しては自動で右へ一定の早さで進ませます.穴との距離と方策の確率モデルのパラメータの関係式をソフトマックス関数に入れ,これを計算して勾配を求めてパラメータを更新しました.


$$ \nabla_{\theta}J(\theta) = \sum^M_{m=1}\sum^T_{t=1}(R^m_t – \overline{b})\nabla_{\theta}\log{\pi_{\theta}}(a^m_t|s^m_t) $$
$$ \theta_{t+1} = \theta_t + \eta\nabla_{\theta}J(\theta) $$

また,報酬については,ジャンプしたら減点(疲れるから),落ちたら大きく減点,穴を越えたら大きく加点という形にしました.

結果は以下のようになりました.

実際にプログラムを動かしてみると,パラメータとしては初期値に関わらずジャンプアクションができそうな値になるのですが,うまくいかない場合も散見されました.REINFORCE Algorithm よりも工夫された手法もあるのでそちらに変更するのも良さそうです.

ところで, REINFORCE Algorithm ってすごく調べづらいのですが… そもそも強化学習は Reinforcement Learning なのでこちらばかり出てきますね.

あと,未だに上に挙げた式でベースラインを引いて良い理由がわからないので,誰か教えてください.

迷路にQ学習を使ってみた

お久しぶりです.ユーザ名を今回から Twitter に合わせて TRSasasusu にしました.

スクリーンショット 2017-08-03 4.06.12

記事にできるような活動があまりできなかったため,気がついたら前回の何か作った系の投稿から7ヶ月も経ってしまいました.今回の投稿は去年UMU氏が投稿したものを大いに参考にしています.(というか,ほぼ同じ.違う点は迷路が大きくなったことくらい)

Q学習は


$$ Q(S_t, A_t) = Q(S_t, A_t) + \alpha(R_{t+1} + \gamma \max_{a’ \in A(s’)} Q(S_{t+1}, a’) – Q(S_t, A_t)) $$

に従って行動価値関数を更新します.そもそも行動価値関数とは,といったことはこちらもUMU氏がまとめてくださっています.ありがとうございます.

方策決定には ε を固定した ε-greedy 法を用いています.これにより局所解を抜け出せるようにします.パラメータについては,


$$ \varepsilon = 0.1 $$
$$ 学習率\ \alpha = 0.1 $$
$$ 割引率\ \gamma = 0.9 $$

としています.

やっぱり途中で戻ったりするようになってしまいますね…何ででしょうね.

あと,Pygame 便利ですね.

今回のスクリプト(q_maze2.py, moyf/ml/rl/q.py)

パラレルデータを用いない多対1声質変換

久しぶりに声質変換の活動を行ったので記録します。以前の記事から半年ほどが経ちました。

https://kcs1959.jp/archives/2432/research/フレーム独立gmm-based-mappingによる声質変換

今回参考にした論文はAI班の記事でも紹介されていますが、以下のような手法です。本文はこちら


声質変換は研究者の数が少ないので他のAI分野に比べて勢いがなく発展が遅れていますが、この手法は2016年8月に発表された画期的な手法です。この手法の凄いところは主に以下のような点です。

  • 同じ内容を話している音声データが必要ない
  • 学習で使った人以外の声からも変換できる
  • 実装が比較的楽にできる

今までの多くの声質変換手法では、同じ内容を話している音声のデータが必要で、学習で使用した人からの変換しかできませんでした。また、最近の手法はなかなか実装が難しいことも個人的には悩みどころでした。

今回の実装ではSPTKという音声分析ツール、Kerasというニューラルネットワークライブラリを主に使用しました。また、音声コーパスはPASDというものを使わせてもらっています。

声質変換の結果は以下のようになりました。
まずは変換元(入力)の声です。改めて強調しておくと、この人の声は声質変換を学習する(変換器をつくる)ときには全く使っていません。

そして変換結果が以下の音声です。変換先の声の目標は水瀬いのりさんという声優の声を使用しています。ラジオの音声を私的に録音したものです。水瀬いのりさんの実際の声はこちらなどを参照してください。

まだ不自然な部分や合成音感が残ってしまっていますが、少なくとも女性らしい声に変換されているのがわかります。今回は論文で使用された5分の1程度の時間の音声を使って学習したため、学習データを増やすことでもう少し質が向上すると思います。データが少ない中で精度を向上するために論文で示されているモデルから多少の変更をしています。詳しい内容は僕の個人的なブログも参照してみてください。

近年ではGANなどの生成モデルが盛んに研究されていて、音声の生成もGoogleのWaveNetに代表されるように数多くの新しい手法が提案されています。この潮流の中での声質変換の発展も期待しつつ、僕も引き続き研究していきたいと思います。

量子コンピュータSimulatorを開発しました+量子アルゴリズムの練習をした→悲しい事実に気づく(1)

なぜ量子コンピュータを作ったのか

こんにちは.

今回は,唐突に思いついて作った量子コンピュータシミュレータと,その量子コンピュータを使った量子アルゴリズムの構築法を勉強するための練習についてのお話です.

まず,「量子コンピュータ」と聞くと,一見難しいものと思えるかもしれません.実際,僕も数日前までにはそう思ってました.ところが,数日前に,古典コンピュータ(今皆さんが使っているものです)で数値計算を行うことによって,量子コンピュータの挙動を再現することが可能だということを知りました.このときに,量子コンピュータが実際どういう仕組みで動いているかよくわかっていないことに気付いて,文献を漁って調べてみることにしました.すると,なんだか難しそうだなぁと勝手に思っていたものは,実際にはそんなに難しくなく,再現するための数値計算の手法も難しくないことを知りました.

という経緯があって,量子コンピュータが(数値計算上では)誰にでもつくれるという考えに至り,実際に作ってみようということになりました.

量子コンピュータは何で動くか

古典コンピュータは,AND回路やOR回路などの,複数の古典ビットを何らかの物理的相互作用を用いて変化させることで,様々な情報を処理しています.このことからもわかるように,古典コンピュータの情報の最小単位は,1古典Bitという,0か1かの区別であり,これより小さな情報の単位は存在しません.普段我々が目にしている古典コンピュータは,古典Bitを用いてどのように情報を処理しているのか見ることはありませんが,中身は古典Bitの膨大な操作によって,動いています.これらは,古典Bitをどのように操作するかの技術(≒アルゴリズム)によって支えられています.

一方,量子コンピュータの動作は古典Bitによるものではありません.量子コンピュータの情報の最小単位は「量子ビット(qubit)」と呼ばれるものです.量子ビットは,0か1かの厳密な区別である古典ビットと違い,0か1かの確率的な状態を保持しています.量子ビットは古典ビットではないので,表記法も異なります.例えば,1量子ビットは,a|0>+b|1>のように表記します(ディラックのブラケット記法).ここで,a,bは複素数です.つまり,量子ビットは,0と1がそれぞれa,bだけ含まれる,という状態を保持することができるのです.もちろん,量子ビットは量子(の性質を持つもの)ですから,「観測」を行うことで0か1かが確定します.すなわち,|0>か|1>になるということです.どちらに確定するかは,もともとの量子ビットの状況(a|0>+b|1>)に応じて確率的に決まります.具体的には,a|0>+b|1>である量子ビットが|0>になる確率は,|a|^2で,|1>になる確率は,|b|^2です(このことからもわかるように,|a|^2 + |b|^2 = 1 が満たされる必要があります).ここで重要なポイントは,我々は量子ビットの状態を「観測」せずに知ることができないということです.これは,a,bを直接的に知ることができないということを表しています.

もう一つ,量子ビットについての重要なポイントがあります.それは,量子の「もつれ(entanglement)」です.量子のもつれとは,簡単に言うと,複数の量子Bitがあったとき,複数の量子Bitを観測したときの確率論的独立性がない状態のことです.具体例をあげてみます.今,2つの量子ビットX,Yがあったとします.X,Yがもつれていないときは,XとYを観測したとき,観測されたXの値が0,1どちらであっても,観測されたYが0,1を取る確率は,変わりません.これは,2つのさいころをどうじに投げた状況に似ています.一方のサイコロの目が1だろうが,2だろうが,もう一方のサイコロの目は等しく1/6ですよね.しかしながら,X,Yがもつれているときは,Xの値が0,1どちらになるかによって,Yが0,1どちらになるかの確率が変わってしまうのです.サイコロの例でいうと,2つのサイコロを同じ向きで完全に固定したときに似ています.一方のサイコロの値が1であったら,もう一方は1でしょう.もちろん,一方のサイコロの値が1であったら,もう一方は奇数が出やすくなる,のような例もありですね.このようなもつれ,の状態は,もはや|X>=a|0>+b|1>,|Y>=c|0>+d|1>のような表記はできません.量子がもつれているような状態を表記するためには,|XY>=e|00>+f|01>+g|10>+h|11>のようにします.このような状態の量子ビット群では(X,Y)が(観測したときに)(0,0)を取る確率がe^2,(0,1)を取る確率がf^2,…ということを意味しています.ここまでくればお気づきでしょうが,(任意にもつれさせることのできる)量子ビットがn個あれば,2^n通りの観測結果の確率を表現できます.このことは,非常に重要なことです.すなわち,適切に量子ビットを操作することで,確率的に存在しているあらゆる組み合わせの計算を一度に行える可能性があるということです.

これらの話から,量子コンピュータは,どのようなアルゴリズムで動くのか予想がついた方もいるでしょう.すなわち,量子コンピュータは,量子ビットを操作し,もつれさせ,観測を行うことで,結果を得る,という仕組みです.

量子コンピュータをシミュレートする

と,いうのが量子コンピュータの簡単な説明なのですが,文中に会ったように,結局は,量子の状態は.量子ビット数nに対して,2^n個の複素数で表現できるということです.量子の操作は,この2^n個の複素数を,量子の操作に対応する関数を用いて,写像させることで表現できます.つまり,古典的コンピュータで,量子コンピュータがシミュレート(数値計算で仮想的に実現するということ)することができるということです.よって,作りました(演繹的).

今回は,「量子コンピュータが実装できたよ」ということを示すために,簡単な量子プログラムを作って,結果どうなったかを示したいと思います.そのために,まず(このシミュレータが)量子操作としてどのような操作が行えるのかを,簡単に書いておきます.

.量子ビット数は11qbit.(なぜ,11なのかは,特別な理由はない)

・量子ビット初期化:量子ビットを,任意の確定値にする(|XYZ…>=|01010…>)

・1つの量子ビット(任意)を,パウリ行列(X,Y,Z)とかアダマール行列(H)を用いて変換する.(詳しくは後述)

・1つの制御量子ビット,1つの目標量子ビットを,パウリ行列(X,Y,Z)とかアダマール行列(H)を用いて,制御変換する.(詳しくは後述)

・2つの制御量子ビット,1つの目標量子ビットを,パウリ行列(X)を用いて,制御制御変換する.(詳しくは後述する.)

imagee
量子コンピュータシミュレータ(開発中)の画面

これらの操作機能を持った,量子コンピュータを使って,(僕が勝手に考えた問題)4=x+yを解いてみようと考えた.

…のだが,量子プログラムを書いてからとても残念なことに気づいてしまったのである.

文章が予想以上にながくなったので,これを前半として,前後半に分けて投稿することにする.つづきは,後半で.

 

 

 

 

フレーム独立GMM-based mappingによる声質変換

こんにちは。1年のSannkoです。AI班です。

初投稿になります。

宜しくお願いします。

 

UMUさんの記事にもありますが、AI班は声質変換の活動をしています。

まだどのような手法で声質変換をしていくかは検討中ですが、既存の手法を試してみようと思います。

 

戸田さんの論文の2章に書いてある、提案手法ではない古い手法をやってみます。

この手法ではフレームごとにGMMでソースとターゲットの同時分布を推定して、そこから条件付き確率やら周辺確率が出せるのでそれを使って変換を行います。

フレーム間の関係は全く考えられていないので、最近の手法と比べるとかなり古典的な手法ですね。

 

https://pdfs.semanticscholar.org/d419/ceb2753232373fd4ab9534b371e017cd9dc1.pdf

 

データはこのサイトのものを使わせてもらいました。

ありがたいですね、こういう研究室は。

8.00モーラ/秒の25文のデータを使っています。

 

http://www.it.ice.uec.ac.jp/SRV-DB/

 

女性1から男性への変換をやってみたいと思います。

変換元の女性の声はこれ

 

 

ターゲットはこの男性です。

 

 

この文章のデータは訓練データからは除いてあります。

変換を行った結果がこれです。

基本周波数はそのままなので、声が高くなっているのがわかります。

ただ、声質は男性のものに近くなっている気がしますね(定性的)。

 

 

基本周波数の変換についてはフィルタとの関係などを考えてきちんと検討すべきですが、(正直よく分からないので)今回はとりあえず単純に切片0の回帰曲線でモデル化しました。

単純ですが、画像をみるとわかる通り、それなりに妥当です(定性的2)。

(追記)貼ってから気づいたんですが、この画像は切片を0にする前のやつでした。下のデータに使ったモデルはちゃんと切片0になっています。

figure_1-%e3%81%ae%e3%82%b3%e3%83%94%e3%83%bc

このモデルを使って基本周波数も変換をした結果がこれです。

ピッチを適当に扱ったのでノイズが増えてしまったような気がします(定性的3)。

しかしかなりターゲットの声に近づいたと思います(定性的4)。

 

 

正直、この単純な手法でここまで変換できたので驚いています。

今後は戸田さんの提案手法など、もう少し高度な手法を試してみたいですね。