笑う猫の手

機械学習、ボイトレ、お絵かきなどをしております。

「頭式呼吸」共鳴ボイトレ法 を読んだ。

挨拶

こんにちは。今年は頑張って投稿続けます。
数カ月前から月2回ボイトレ、週1回カラオケに通っています。
とにかく歌うのが好きです。

前書き

私のボイトレの先生はプロデビューを目指す歌手の卵なのですが、
トレーナーとしての実力はそこまでではない(自称)そうなので、自分でも勉強しようと思い一冊本を読んだので紹介します。

「頭式呼吸」共鳴ボイトレ法は
kiss musicというボイトレ教室を立ち上げた平山さんという方の著書で、
これまでのボイトレとは違ったアプローチを紹介しています。

対象は主にポップ歌手です。
これまでのボイストレーニングはクラシックの理論が前提になっており、
ポップに向いたボイトレではない、というのが大きな主張です。
よく知られている腹式呼吸なども否定していました。
また、現代人は蓄膿症や副鼻腔炎で鼻腔を上手く使えず、古い理論を適用するのが難しいとも言っています。
(さらにいうと、その機能が正常に働いているだけで歌は上手く歌える、とまで言っています。科学的な根拠はちょっと怪しかったですが、、、)

共鳴を鼻に固定しろ!

私が一番ためになったと思う部分は、
「共鳴が変わると音程が上下する(安定しない)」という記述です。

声は声帯が揺れ、その振動が口腔や鼻腔で共鳴して増幅され、他人に聞こえています。
その共鳴が起こる部分を著者は共鳴ポイントと呼んでいます。
一般の人はその共鳴を意識できておらず、共鳴ポイントが安定しないため、音程が安定しないとのことです。

そこで、共鳴を鼻の位置で固定することを推奨しています。いわゆる、鼻腔共鳴というものです。
鼻腔共鳴については知っていましたが、固定することで音程が安定する、というのは、衝撃でした。

確かに共鳴の場所が変わる、ということは常に変形し続けるラッパを吹いているようなものですから、
音程が安定しない、というのはかなり納得がいきました。

鼻を手入れしろ!

また、鼻腔の機能を復活させるために鼻うがいをせよ、というのも面白かったです。
さらにはインドヨガのスートラネティという、
鼻から紐を突っ込んで口から片方を出し、鼻腔内をこする
(少々狂気じみた)健康法もやるべき、とのことでした。
さすがにそこまではまだ出来ていませんが、鼻うがいは続けています。
心なしか、アレルギー持ちの鼻の調子が良い気がします。

おわり

鼻を手入れし、歌を鼻に響かせるというのは非常にシンプルで簡単なので、
しばらく続けていきたいと思います。

紹介

心機一転

あけましておめでとうございます。 nozzと申します。

およそ10ヶ月ぶりの更新となります。
驚いたことに、前回書いたResNetの記事が400回ほど読まれていました。
少しでも誰かの役に立てたのなら嬉しいです。

この空白期間はいろいろなことが有りました。
特に、就職して社会人になったことが一番大きな出来事です。
仕事にも慣れたので新しいことを始めようと思い、再び筆を取った次第でございます。

年の初めということで、抱負なぞを語ってみようかと思います。

今年は、週に1度以上の頻度で本ブログを更新します。
わかりやすく書くこと、成果物を上げることの2点を目的とします。

『わかりやすく書くこと』
昨年は学会発表を経験し、「人に伝える」ことの難しさ、
その点における自分の未熟さを思い知りました。
ブログで書くことを習慣化し、伝える能力を高めていこうと思います。

『成果物を上げる』
昨年からボイストレーニングとお絵かきに取り組んでいます。
この成果を、人に見られる場所に公開することで、
自分の尻を叩いてモチベーションにしようという魂胆です。

完全に自己満足なブログですが、
みなさんの役に立ったり、何か考えるきっかけになるものを書くつもりです。

当ブログをよろしくお願いいたします。

ResNetに関する情報をまとめた

Deep Residual Learning for Image Recognition
https://arxiv.org/abs/1512.03385

2015.10 伝説の152層DCNN。


モチベ
深くすることが正義だと考えられていた[1]が、深くし過ぎると性能が悪化することがわかっていた
※現在では広さも重要であるとされている

 

悪くなる理由は、

1. 逆伝播で小さな重みが何度も乗算されるため。degradation(=勾配消失・爆発)が起きる。[2]

消失: 浅い層では入力と出力の差が大きいため勾配を取りやすいが、深い層になるとその差が小さくなり、勾配が取りづらくなる。学習が進めばこの勾配は極めて小さくなり、やがて消滅してしまう。


2. 順伝播の際、ランダムに初期化された重みによって特徴が消えてしまい、後ろの層まで伝わらないため[2]

 

3. 単純に計算時間がかかる

[1]The Power of Depth for Feedforward Neural Networks
https://arxiv.org/abs/1512.03965
[2]Deep Networks with Stochastic Depth
https://arxiv.org/abs/1603.09382

 

解決策
identity mappingを追加し、Residual learningを行う

何層か前の情報をそのまま足すことで、その間の層は入力と最適な出力の差分(=残差)を学習する

 

何が良いのか?
feedforward時の情報消失を防げる。同様にbackpropagationの際も勾配消失しにくい。
入力が最適な出力に近ければ、重みを少しだけ更新すれば良い

 

派生研究
ResNetのモデル構造[3]
full pre-activationが一番良いらしい。 BN→ReLU→Conv→BN→ReLU→Conv→Concat

いろいろな派生モデル(有名所)[4]
Wide ResNet[5]]
浅くWideにしたほうが、パラメータは増えるが高精度+高速に学習できる
Residual unitの中にDropoutを入れることを提案

PyramidNet[6]
Deep Networks with Stochastic Depth[7]
Dropoutのようなイメージで、バッチ毎にResidual unitをランダムにDropする。
通常のResNetと比較して学習が早く高精度

PyramidSepDrop[8]
例の阪大の学生が趣味で発見したモデル
PyramidNet + Stochastic Depth
CIFAR-100/100でSOTA

ResNeXt[9]
ResNetは浅いネットワークのアンサンブル学習を行っている[10]

 

[3]Identity Mappings in Deep Residual Networks
https://arxiv.org/abs/1603.05027v1
http://qiita.com/supersaiakujin/items/eaa0fe0460c470c28bd8

[4]ConvNetの歴史とResNet亜種、ベストプラクティス
https://www.slideshare.net/ren4yu/convnetresnet

[5]Wide Residual Networks
https://arxiv.org/abs/1605.07146

[6]Deep Pyramidal Residual Networks
https://arxiv.org/abs/1610.02915

[7]Deep Networks with Stochastic Depth
https://arxiv.org/abs/1603.09382

[8]Deep Pyramidal Residual Networks with Separated Stochastic Depth
https://arxiv.org/abs/1612.01230

[9]Aggregated Residual Transformations for Deep Neural Networks
https://arxiv.org/abs/1611.05431

[10]Residual Networks Behave Like Ensembles of Relatively Shallow Networks
https://arxiv.org/abs/1605.06431

 

[お世話になった参考記事たち]
https://deepage.net/deep_learning/2016/11/30/resnet.html
http://qiita.com/supersaiakujin/items/935bbc9610d0f87607e8
https://www.slideshare.net/masatakanishimori/res-net
http://terada-h.hatenablog.com/entry/2016/12/13/192940

 

 

evernoteのメモから貼り付けたのですが箇条書きが綺麗に出なかった・・・
めちゃ見づらいので後日修正予定。

投稿1回目

投稿一回目だが今日chainerで書いていてハマったところを記録してお茶を濁す。

誰かを救えれば幸いです(遠い目)


validationのためにiteratorを作る際、repeat=Falseを指定しないとずっとtestが回ってる。
永遠に回ってるのかはわからないがかなり長い時間やってた。

val_iter = chainer.iterators.MultiprocessIterator(val, batch_size=4, repeat=False)




転移学習する際、以下のようにモデルを書いているとモデル初期化の際にWeightが初期化されずうまくコピーできない。

 conv1=L.Convolution2D(None,  96, 11, stride=4)

ちゃんと入力バンド数を指定すればOK

 conv1=L.Convolution2D(3,  96, 11, stride=4)


finetuningのやり方はこちらを参照。ありがたい。
Chainerでファインチューニングするときの個人的ベストプラクティス - Qiita



基本的にはこんな感じで詰まったとことか、実験したこととか、論文のサマリーとかを載せていくつもりです。