停滞すること幾年月
こんにちは。かえるのクーです。
手痛いです。今年はさっぱりです。参考にできる「ちょうどいい」情報が少ないです。サウンドに関する情報は超アカデミックか、(あたりまえですが)フーリエ変換やウェーブレット変換を前提にしたものばかりです。
フーリエ変換やウェーブレット変換自体の機能(周波数解析)を自己符号化器に「実質的」にやらせよう発想がそもそもおかしいのは自覚しています。でも、やれる?という「素朴な疑問」を持ってしまったので仕方ありません。「素朴な疑問をやってみる」のがこのブログのコンセプトでもあります。
うまくいっていない点
波形がプラスとマイナスで形がかなり違い、歪んでいる。
ノイズ成分が収束していかない。
どうやっても(うまくいく例で)原音の音程がわかる程度。(なので最初「そこそこ」うまくいったのは「たまたま」だったようです)
さて何が悪かったのでしょう
波形の歪については、分かってみればあたりまえですが、一番の原因は「活性化関数」でした。どの参考書をみても「最終段は恒等関数(リニア)がよい」を書いてあるにもかかわらず、1段目と2段目の関数は同じ関数しか使えないようなプログラムでした。
そのため、最終波形は、「活性化関数のリミッター」がかかったような歪んだ波形になっていました。(ノイズ成分も一律歪む:マイナスが抑制される活性化関数ではマイナス側が極端に歪む)
雑音については、最初の乱数で発生している「高い周波数」の雑音相殺や丸め込みがどうしてもできないので、(雑音が)収束していきません。
いろいろ、うまくいかないので、どうすればいいかぼんやりとずーっと考えていました(ボクはこれを思考実験と呼んでいます;p)。そろそろまとめにはいって進めないと、冬が来てしまいます!(熊さんはそろそろ冬支度の活動をはじめているようです。)
改善のポイント(として考えたこと)
・各段での活性化関数を自由に設定できるようにする。
・最終段の活性化関数はリニアもしくは原点対称のゆるやかな(リニアに近い)非線形関するとする。
・W初期化は一様分布の乱数を指定しているが、特定基底周波数のsin波形、もしくはウエーブレット波形を初期値とする。
・W初期化としてsin波形を使う場合、振幅は(いんちきですが)元波形に近い減衰エンベロープのものを準備して改善されるかやってみる。
・W初期化としてウエーブレット波形を使う場合は、周波数のほかに「位置」のバリエーションを考慮する。このため、W配列の個数を増やすか、W配列をコンパクトにして任意の位置で計算できるようにする。
・コーディング力があれば、Wをすべて短いウエーブレットとし、波形全体をスウィープさせて局所的な活性化値を求め、復号は逆に局所的な活性化値からウエーブレット合成で行うことでできるようにすれば、かなりの復元能力が見込める(はず)。(これはもう自己符号化器といえるか疑問ですが。。。)
この3連休がんばってみます。
(あとでできぐあいをここに書きます。実験報告できるようなら実験編をかきます。)
経過報告
まずは、重みwの初期値をsin波にしてやってみました。
平均律の周波数のsin波88個(ピアノの鍵盤の個数)準備して、1音程につき、位相を45度づつずらしたものを8個準備してwにセットして学習してみました。
期待としては、各sin波に学習対象の音(ピアノ、ストリングス等)の楽器的な倍音がのっていき、その組み合わせでいろいろな楽器の音を「そこそこきれいに」形成できることを理想としていました。
結果は、「どうがんばっても、sin波に不協和音的な周波数やノイズ的音が載っていき」、出力するときにその不協和音的周波数を相殺しきれずに、学習すればするほど元の音から離れていきます。(涙)
自己符号化器はsin波の重ね合わせで音を表現できることを知らないので、無理もないのですが、wが初期値sin波のままの、まだ「学習していない」状態がいちばんきれいに聞こえました。
音によっては途中までかなり波形的に近くなるケースもあるのですが、学習をつづけるとどの音も「ホラー映画の不協和音なアンビエント音」になってしまいます。
たぶんですが、
・ある程度の長さの持続的音程波形であれば、自己符号化器はフィルタにsin波を設定すれば、かなり精度のよい検出器として機能できる。
・自己符号化器は「そのままのしくみでは」重みWについて、基底として純粋なsin波や倍音を学習していくことは困難である。
・耳は伊達に物理的フーリエ解析機能を持っているわけではない。必要だったからそう作っていったのでしょう。(飛躍ですが、そう感じたので書きました)
(連続)sin波重み初期化作戦は初期値以上によくなる学習ができそうにないので、ウェーブレット作戦に移行します。
次にウェーブレット重み抽出解析(変換ではない)をやります。
これはプログラムをかなり書き換えないといけないので、がんばります。こちらは学習機能を確認するのではなく、抽出機能としてどれくらいできるのかを確認するものです。(音も画像の学習のように「ウェーブレット(ガボール)フィルタ」を学習して取得できるようになればおもしろいのですが、たぶん今の流れでは難しそうですので、抽出機能の確認に留めます。)
さて、ウェーブレットのページをいろいろ見ましたが基底の波形を作る計算式が厳密にやると少し(ぼくにとっては)難しいので、近似します。
・波形のエンベロープは「ウェーブレット」の計算式ではなく、ハニング窓の式で代用(近似)する。「マザーウェーブレットは自分で定義してもいい」と書いてありました。
・スケール(伸縮)については自己符号化器のWのサイズをある程度固定にしたいので、段階的にする。(真面目にやるとWのサイズが全部違ってくるので、行列計算にならないため)
例:100Hzまで800サンプリング、200Hzまで400サンプリング、、、800Hzより上は50サンプリングなど、基底周波数帯域によりWのサイズをかえる。
・トランスレート(平行移動)については、Wのサイズに従った基本的移動と組み合わせる。(Wサイズの1/2または1/4)
・基底周波数の位相にいては45°単位で基底周波数ごとに8パタン持つことにする。
これぐらい簡略化すれば、(数学的飛躍はともかく)方式の意味合いを崩さずにボクでもコーディングできるような気がします。
なお、今回お勉強したのは以下のサイトです。理解するまではいきませんが、今回は雰囲気がわかる程度でいけると思います。
わ~、できそうと思ったのが気のせいでした。汎用性をもってコーディングしようとするとめちゃ難い。汎用性を無視して周波数帯ごとに区切ってにまわせるか試行中ですが、むりぽです。
難しいので、学習機能を完全に削除して純粋にウエーブレットでエンコード、デコードのみをするプログラムにしました。位相45°単位では波形を見る限りはそこそこいけているのですが、音を聞くと全然でした。
思ったようにはどちらもいかなかったのですが、実験結果として改めてレポートします。(失敗系のレポートです。記録として書きますが、きっと、読む価値がありません。「めげた」ので明日書きます。)
思うようにいかなかった点
サイン波の重み初期化実装:それぞれのサイン波に楽器とにたような倍音がのっていくことを期待→倍音がのっていくことはまったくなく、ノイズや不況和音がのっていくのみ。最初がいちばん原音に近く、学習すると(学習といえないですが)再生音が崩れていく感じです。
ウェーブレットでの再現:もうすこし原音に近い音がすると思っていましたが、波形はかなり似るものの、音を聞くとまったく別物でした(基底周波数はあっているけど、音色がまったく違う感じ)音は波形が「似ている」くらいでは全く同じように聞こえないことを改めて認識しました。
来月は1ヶ月不在になっちゃいました
スマホは持っているのですが、おでかけ用パソコンを買いました。どうしてもスマホの入力が苦手なのです。音声入力や、小型Bluetoohキーボードも使ってみましたが、どうしても入力や編集がしっくりきません。操作を考えているうちに、考えがどこかへ飛んでいってしまいます。何も考えなくてもそのまま入力できる(くらいに慣れている)パソコンがやっぱりいいです。
ノートパソコンは高くて買えないので、スティックタイプのパソコンを探しました。
最低でもメモリ4GB、Windows64Bitのものをさがしましたが、そのスペックでスティックタイプのは高かったので、「ボトルタイプ」の持ち運べるものにしました。
これです。
ドスパラという会社で扱っている デジノスというシリーズです。 税別、送料別で14,800円でした。 |
おこずかい的にはちょっと厳しかったですが、今月は「本」の購入を我慢します。
ワイヤレスのキーボードとマウスがついて、OSもプリインストールされていて音も出て簡易カメラもついて、バッテリーもついてこのお値段ならまぁ、いいかな?という感じです。
現メイン機(Core i7-2700K)の1/3くらいのスピードでメモリも4GBしかないですが、お出かけ用としてはOKかなとおもいました。今はこれにPycharmとかanacondaを入れて軽い実験はできるようにしています。
お出かけ先には「テレビ」はあるので、HDMIでにつないでディスプレイにします。