クーの自由研究

最下層からまた一段ずつ螺旋階段を登り始めます

計算機音楽の自由研究(実験:その3)~失敗はよくあることさ~

実験は失敗でした

 こんにちは、こんばんわ。かえるのクーです。
予告とおり、うまくいかなかった実験結果の報告をします。f:id:np2LKoo:20170919223929j:plain

初期重みにsin連続波形を使っても、最初はそこそこな再生音がどんどんホラーになっていく件

 音を自己符号化器にかけて復元する実験をしています。フーリエ変換などをかけずに直接自己符号化器にかけて復元できるかどうかを確認します。

自己符号化器でノイズはひどいものの音程がわかる程度に再現できたので、「正解」ともいえる「重み」を単一のsin波(のいろんな周波数や位相のセット)にしてそこを起点にして学習が良い方向に進むかどうかの実験です。

初期重み設定作戦

 

・初期重みWは(MNIST画像処理のときから)一様乱数を使用していました。
・画像処理の自己符号化器に強引に生の波形データを学習させたら、意外にも音程がわかるくらいに再現できるケースがありました。
・最初からsin連続波形を使ったときにそこにうまく倍音などが載っていき、きれいな再生音がでるかもしれないと思いました。
・W1(1層目の重み)はハイパータンジェント、W2(2層目の重み)は恒等関数(リニア)にして学習しました。

 

結果

原音、学習直後の復元音、1024(sub)epoch=約1epoch学習済の3パタン(0.8秒つづ)


学習をしない初期状態の自己符号化器が視聴上いちばんきれいな音を再生し、学習が進むにつれて不協和音やノイズの酷い音になっていきました。かなり急激に劣化したあとはそれほど音がかわらなくなるので、3パタンの音にとどめています。

 

考察

画像では「ガボールフィルタ」様の重みを自動的に学習していけましたが、音(の波形)ではまったく基本的なまとまった音(もしくは相殺してきれいな再生音になるような重み)は学習できませんでした。
文献にもそのような傾向(画像はうまく設定すれば、通常の自己符号化器でガボールフィルタが形成されるが、音の(通常の)学習でウェーブレットなどの基底が学習されるケースは知られていない)とありました。(文献のURLはどこかへ行ってすぐでてきません。あしからず)

現状のままでは「きれいな」特徴分離は無理があるとおもわれます。

ウェーブレットで重みを初期化する大作戦

ウェーブレットで波形をスウィープすれば、きれいな波形が自己符号化器でエンコード、デコードできる?かを確認しました。

ウェーブレットでの実験概要

ターゲットの波形:8bit 4000Hzサンプリング 3200sample(0.8秒)
調整したプログラム
以下のウェーブレット波形を重みとして作成(8bit 平均律半音)し、ターゲット波形の各ポイントに対してシフトしながら演算(行列直積計算)していく

・27.5Hz以上 1600sample(A音を境にしている)5点演算
・55Hz以上 800sample  9点演算
・110Hz以上 400 sample 17点演算
・220Hz以上 200 sample 33点演算
・440Hz以上 100 sample 65点演算
・880Hz以上 50 sample 129点演算
・1760Hz以上 25 sample 257点演算
それぞれの周波数に対して、45°刻みの位相、ウェーブレットのエンベロープとしてハン窓を使用

「27.5Hz以上 1600sample」のウェーブレットでターゲットの波形を800サンプル(ウェーブレット幅の半分)づつずらし、前後800サンプルはみでるのを含めて5回演算
同様に「1760Hz以上 25 sample」では12または13サンプルずつずらして、257回演算しています。

各ポイントでの演算は通常の自己符号化器の「エンコード」(W1層演算)、各ポイントで計算した値(行列)を、同様に自己符号化器の「デコード」(W2層演算)して復元していくものです。(デコード演算は恒等(リニア)関数の重ね合わせです)
できればバイアスだけでも学習させたかったのですが、「学習なし」でどうなるかを実験しました。

結果

原音-復元音の繰り返し×3音(各音0.8秒)

比較的似ている2番目の音について波形比較してみます。上がオリジナルで、下が自己符号化器での復元。

f:id:np2LKoo:20170920200308p:plain

エンベロープはすこし変動があるものの、まあいい感じです。

最初の部分を拡大します。同様に上がオリジナル、下が自己符号化器での復元です。

f:id:np2LKoo:20170920200353p:plain

位相はみごとにそろっていますが、振幅は微妙に差があります。

波形の図形にあわせて再現するのは位相の再現を最優先している感じです。(振幅が多少ずれるより、位相がずれたほうが差異(多次元ベクトルの直積差)が大きいため、位相をあわせることを優先してフィルタリング・合成している感じです:位相がすこしずれていただけでフィルタを通る値がとても減る)

中盤部分を拡大します。

f:id:np2LKoo:20170920200705p:plain

こちらも振幅は微妙に差がありますが、位相は上下でほぼそろっています。

ただし、波形でみるより実際の音の差異はとても大きく感じます。

違いが大きい3番目の波形を比較してみます。

f:id:np2LKoo:20170920201416p:plain

これも位相は合っていますが、振幅がかなり違います。視聴上の周波数特性もかなり違って聞こえます。

もっときれいな音になる予想をしていましたが、音程はほぼ再現できるものの、音程が揺れたり、かなり違った感じに聞こえました。
もっと位相やシフト幅をこまかくとれば、きれいな波形が再現できる「かも」しれません。

。。。

結局、追試することにしました。

スウィープシフト幅をウェーブレットの1/2から1/4へ、位相も45°(一周の1/8)刻みから22.5°(一周の1/16)刻みへ細かくして、もうすこしまともになるかやってみます。

 なんと、急によくなってしまいました。

原音-復元音の順に10音を抽出して再生しています。復元音は丸くなってはいますが、ほぼ原音の周波数特性や「雰囲気」を再現できています。ウェーブレットなかなかです。

こちらは、あながち失敗ともいえない感じがしてきました。

自己符号化器の「学習」でもこれくらいの再生ができるようにならないかな。。。

(誤解のないように改めて言いますと、この実験は「自己符号化器」のしくみは「ほぼ」そのまま使用しています。ただ使用している「重み」は「学習」したものではなく、「半音刻みの各周波数について、1/8分刻み(または1/16刻み)の位相シフトでのウエーブレット波形」を設定してのエンコード・デコード復元音です。「重み」が学習したものでないほかは、時間方向にシフト(スウィープ)しながら音をエンコード・デコードしている点がオリジナルの自己符号化器と異なります。符号化、復号化を自律的にやっていないので「自己」(Auto)がつかない単なる「符号化器」(Encoder/Decoder)です。)

ちょっと気力が回復したので、もう少し長い音をスウィープして再現してみます。

 (実験中:やたら長い音(曲の一部)でやったら配列(行列)の整合性が崩れて調整中:明日がんばる。長い音は一度に配列に入れずに部分的なスコープで見て、スコープをずらしていくことでどれだけでも長い音がエンコード・デコードできる気がしてきたので、宿題にします。:汎用的に今後もウェーブレット関連実験するならつくりなおしたほうがよいので、思案中(精度を極端に落としているので、実際の曲などでやってみるには精度がわるすぎる:内部は4Kzサンプリング 8bitまで落としているので。。。)

→すこし汎用的につくりたくなったので、「長い音」実験は保留してウェーブレット版符号化器を作成してみます。この実験編はこれにて一旦終了し、準備編にて、継続します。(このまま進めると、「まぁまぁいい感じだけど、曲のエンコードには解像度悪すぎる。」という結果になるはずなので、解像度(音だとなんていうのかな?)をあげて実験します)

PGができたら改めて実験編にて報告します。

感じたこと

・やっぱり、フーリエ変換やウェーブレット変換を真面目にやろうっと。

・ウェーブレット重みでの自己符号化器のエンコード、デコードについては、周波数、位相、窓枠が離散的です。離散ウェーブレット変換しているのとほぼ等価であると認識しています。

・学習「初段」は、逆伝搬でなく、SOM(自己組織化マップ)させたい。似た情報は自律的に(逆伝搬の方法でなく)順伝搬の過程で統合して処理学習していくのがよいと強く感じました。

 

最近気になること

コネクトーム」がとっても気になります。

あ、ちなみにボクが深層学習とかRNNやるのはもっと、たぶんずっと先です。

自己符号化器で精一杯です。