ビッグローブ光 with Buffalo WSR-1166DHPL2

はじめに

ビッグローブ光のマンションタイプを契約・開通したが一桁Mbpsしか出ない。。。IPv6設定を行うことで二桁Mbpsに改善するという記事を見つけ、試してみた。ビッグローブから有償貸与のルータではなく、私物のBuffaloルータの設定で苦労したことについての記録。

環境

手順

  • ビッグローブ光を申し込む
  • 開通する。公式WebSiteによると開通から4-5日後にIPv6オプションが使用可能となるらしい。今回は開通の翌日夜にメールがきて、IPv6オプションが使用可能となった旨連絡があった。
  • 光コンセント⇔ONU⇔ルータ⇔win10 PCとつなぐ。
  • ルータにてPPPoEの設定を適用。とりあえずネットにつながった。速度は一桁Mbpsほど。。。
  • ルータの設定を変更する。
    • 詳細設定
      • Internet
        • Internet
          • IPアドレス取得方法:IPv6オプションを使用する
        • IPv6
          • IPv6接続方法:NDプロキシを使用する
  • 設定変更を適用すると、ルータが再起動する。再起動して、ネット接続までに1分くらいかかる(ステータスページの「Internet」の「状態」が”接続中” →” 通信中”に切り替わる)。
  • 速度が二桁Mbpsほど出ることを確認!きた!!
  • BIGLOBE公式のIPv6確認サイト

参考サイト

 

digits 5.0 with nvidia caffe 0.15.14 on ubuntu 20.04 with RTX 2070 Super

An install log for nvidia caffe 0.15.14 on ubuntu 20.04 with RTX 2070 Super. The main difficulty is that the gpu requires a newer version of CUDA while digits and caffe requires older versions. The version of python is 2.7.

  • Install Ubuntu 20.04 LTS
    • Install the OS from an ISO image.

 

  • Sudo update
    • On 2020/11/3, apt update is terribly slow due to poor repository servers. You can use alternative servers by the command below:
    • sudo sed -i.bak -r ‘s!deb \S+!deb mirror://mirrors.ubuntu.com/mirrors.txt!’ /etc/apt/sources.list
    • sudo apt update && sudo apt -y upgrade && sudo apt -y upgrade
    • sudo reboot

 

  • Install some tools
    • sudo apt install -y vim sl git

 

  • Install Cuda 10.2 and Cudnn 7.6.5
    • To install cuda, you need gcc9 and 7. What’s important is the latter must be the default.
    • sudo apt -y install build-essential #=> gcc-9 is installed.
    • sudo apt -y install gcc-7 g++-7 #=> gcc-7 is installed.
    • sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-7 100
    • sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-9 50
    • sudo update-alternatives –config gcc #<= press enter if you are asked something
    • Download a .run file for Cuda 10.2 and a .tar.gz file for Cudnn 7.6.5 from nvidia.com. Install them by the command below:
    • sudo sh ~/Downloads/cuda_10.2.89_440.33.01_linux.run –silent
    • sudo tar -xzvf ~/Downloads/cudnn-10.2-linux-x64-v7.6.5.32.tgz -C /usr/local
    • sudo reboot
    • nvidia-smi #=> this may return like “Driver Version: 440.33.01 CUDA Version: 10.2”
    • echo ‘export CUDA_HOME=/usr/local/cuda’ >> ~/.bashrc
    • echo ‘export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64’ >> ~/.bashrc
    • echo ‘export PATH=$PATH:${CUDA_HOME}/bin’ >> ~/.bashrc
      source ~/.bashrc
    • nvcc –version #=> this may return like “release 10.2, V10.2.89”

 

  • Install tools for build
    • sudo apt install -y python-is-python2 libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev git cmake libboost-all-dev python-numpy curl python-dev
    • sudo apt install -y python-is-python3 python3-pip #<= Python3 may not be needed… This note is a log from a trial.
    • curl https://bootstrap.pypa.io/get-pip.py –output get-pip.py
    • sudo python2 get-pip.py
    • rm get-pip.py

 

  • Install boost-1.72.0
    • cd ~
    • mkdir boost && cd boost
    • wget https://dl.bintray.com/boostorg/release/1.72.0/source/boost_1_72_0.zip
    • unzip boost_1_72_0.zip
    • cd boost_1_72_0
    • ./bootstrap.sh –with-python-version=2.7
    • sudo b2 -j8 –cmakedir=/usr/local/lib/cmake -a install #=> the command may return “– The C compiler identification is GNU 7.5.0” and “– The CXX compiler identification is GNU 7.5.0”

 

  • Install caffe
    • cd ~
    • git clone -b v0.15.14 https://github.com/NVIDIA/caffe.git caffe.nvidia-0.15.14
    • cd caffe.nvidia-0.15.14
    • sudo pip install –use-feature=2020-resolver -r python/requirements.txt
    • vim cmake/Dependencies.cmake #=> Edit “Boost 1.46” to “Boost 1.72”.
    • vim cmake/Cuda.cmake #=> according to https://github.com/NVIDIA/nvidia-docker/issues/797, please modify at L.95 “caffe_detect_installed_gpus(__cuda_arch_bin)” to “set(__cuda_arch_bin “75”)”.
    • vim src/caffe/layers/window_data_layer.cpp #=> the cpp requires to replace the opencv constants of ver.1 to ver.2
      • CV_LOAD_IMAGE_COLOR => cv::IMREAD_COLOR
    • vim src/caffe/util/io.cpp #=> the cpp requires to replace the opencv constants of ver.1 to ver.2
      • CV_LOAD_IMAGE_COLOR => cv::IMREAD_COLOR
      • CV_LOAD_IMAGE_GRAYSCALE => cv::IMREAD_GRAYSCALE
    • mkdir build && cd build
    • CXX=g++-7 CC=gcc-7 cmake ..
    • make all -j8 && make all -j8 && make all -j8
    • make install

 

  • Install digits
    • cd ~
    • git clone -b v5.0.0 https://github.com/NVIDIA/DIGITS.git digits-5.0
    • cd digits-5.0
    • sudo pip install –use-feature=2020-resolver -r requirements.txt
    • sudo apt install -y libfreetype6-dev
    • CAFFE_HOME=~/caffe.nvidia-0.15.14 PYTHONPATH=~/caffe.nvidia-0.15.14 ./digits-devserver

 

  • Search key
    • ubuntu install digits linux
    • 2080 2070 2060 GTX  nvidia
    • dospara garellia SF
    • ubuntu 20.04 LTS, 18.04, 16.04
    • ubuntu 古いcaffe 古いdigits
    • ubuntu 新しいgpu インストールできない

power button on ubuntu20.04LTS

Before ubuntu 16, you can shut down the PC with some script by the power button at the front of box. However, the technique is not applicable for ubuntu 20. This note describes an alternative technique, which is made for another purpose and thus not strongly recommended.

  • How to:
    • open a terminal and type the command below
    • hostnamectl set-chassis vm
  • Notes
    • The command is applied at that time.
    • You can try push the button on the PC to shut it down.
  • Search key
    • ubuntu 20.04 LTS, power button, shutdown, /etc/acpi/events/powerbtn, linux
    • ウブンツ, 電源OFF, 電源が切れない, シャットダウン,

miracastドングル@win10

はじめに

miracastドングルを購入してwindows10のノートPCに挿して使ってみました.カタログスペックどうりの性能は発揮したものの,用途には合わずでした.お蔵入りとなってしまいそうですが記録を残しておきます.

環境

toshiba製 windows10ノート KIRAシリーズ
IOデータ製24inch 液晶モニタ
miracastドングル https://www.amazon.co.jp/gp/product/B07WF8TGX1/ amazon で2600円ほどで購入,翌日には配送完了された.
Buffalo製Wifiルータ.

手順

MiracastドングルをWifiネットワークに参加させる

  • そのために,一旦WindowsノートをMiracastドングルのネットワークに参加させてMiracastドングルのネットワーク設定を変更し,その後Wifiネットワークに参加させるという手順をとる.
  • Miracastドングルを液晶モニタにつなぐ.ドングルにMicroUSBケーブルを挿し,ACアダプタから給電する.液晶モニタにUSBポートがあればそこからの給電でOK.Miracastは通電と同時にWifiアクセスポイントおよびWifi子機として動作を開始する.
  • 液晶モニタを電源ONすると,Miracastの説明画面となる.MiracastのアクセスポイントのIPアドレスとSSIDが表示されているのを確認.
  • WindowsノートでWifiのアクセスポイントを探し,先ほどのMiracastのアクセスポイントに接続する.工場出荷時のパスワードは12345678.
  • WindowsノートでWebブラウザを起動し,MiracastのアクセスポイントのIPアドレスにアクセスする.Miracastのドングルが子機として接続可能なSSID一覧が表示される.所望のSSIDを選択し,パスワードを入力すれば接続が試みられる.
  • この後,パスワードに不備があれば再設定を促すダイアログとなる.不備がない場合は,接続を試みる画面が延々と表示されるだけで先に進まない.
    ※よくよく見ると,液晶モニタの右上にドングルのネットワーク状況が表示されるので,接続完了したっぽい状況をうかがい知ることは可能.もすこし明示的に示してくれると助かるのだが.
  • WindowsノートのWifi接続をもとのネットワーク(この例ではBuffaloルータのネットワーク)に手動で戻してやる.

WindowsノートからMiracastドングルに画面送信

  • WindowsノートにてWindowsキー+Kを押す.画面右端にワイヤレスディスプレイ一覧が表示される.選択する.
  • 数秒程度で接続完了となる.

やりたかったこと

普段,Windowsノートを持ち歩きして自宅と会社でそれぞれディスプレイに有線接続している.特に自宅の作業環境では作業スペースの確保のためWindowsノートをやや離れたところにおいていて,毎回ケーブルをつなぐのが面倒である.これをMiracast化することでHDMIケーブルの接続の手間を減らしたかった...

実際に試すまで気づかなかったことは,Windows10は「起動時に自動的にワイヤレスディスプレイを探し出して接続する」というアクションができないことであった.有線HDMI接続だとこれが可能で,電源投入さえすれば外部モニタに出力をしてくれる.Miracatsドングルの場合はそれができないので,起動の都度出力先を指定する必要が発生するのであった...!

検索キー

miracast, ミラキャスト, hdmi, chromecast, airplay, any-cast

ATERMモバイルルータMR05LNを常時接続する方法

◆背景&目的

家庭の固定回線によるインターネット通信の冗長化のために,無線通信を用いることが考えられる.
ATERMのモバイルルータMR05LNにDMM.mobile製の格安SIMを挿して冗長化を試みた.
当初容易に実現可能と考えていたがいくつか課題を克服する必要があった.
無事に冗長化できたぽいのでその記録を残す.

◆環境

古いx86ノートパソコンにUbuntu16を入れて構築.

◆技術的課題

USB給電しながら無線通信を連続して行うと,バッテリが枯渇する.
バッテリが満充電状態で無線通信を連続して行うと充電が勝手に停止されてしまい,そのまま通信し続けることにより放電して枯渇する.

◆解決方法

モバイルルータのWebコントロールページにて,モバイルルータを手動で定期的に再起動する.
再起動により「満充電状態で無線通信を連続して行うと勝手に充電が停止」されなくなる(タイマーがリセットされる?).
これにより放電と充電を繰り返す状態となり,常時通信が可能となる.

◆実装

定期的な再起動をプログラムで実現するため,まずはモバイルルータのWebUIを調べる.
WebUIの手動再起動に関するページ(http://192.168.179.1/index.cgi/reboot_main)を見ると,以下のようなFORMで再起動を実行している.
<form name=”reboot_main” id=”reboot_main” action=”./reboot_main_set” method=”post”>
<input name=”UPDATE_BUTTON” id=”UPDATE_BUTTON” value=”再起動” type=”submit”>
<input name=”DISABLED_CHECKBOX” id=”DISABLED_CHECKBOX” value=”” type=”hidden”>
<input id=”CHECK_ACTION_MODE” name=”CHECK_ACTION_MODE” value=”1″ type=”hidden”>
<input id=”SESSION_ID” name=”SESSION_ID” value=”xxxxxxxx” type=”hidden”>
</form>
そこでubuntu16のターミナルから以下のようなコマンドを打つこととする.4時間ごとに再起動を行うこととなる.
while true; do sleep 4h; date; curl -Ss -u admin:admin -X POST http://192.168.179.1/index.cgi/reboot_main_set -d “SESSION_ID=xxxxxxxxxxxx” -o /dev/null; done
あと,MR05LNは初期設定だと勝手に休眠モードに入ることになっている.これをOFFにしておくこと.また,ECOモードもOFFにしておくこと.

◆そのほか

ついでにバッテリ状態と通信状態の取得を定期的に行って,Slackで通知するプログラムを実装.
・バッテリ状態と通信状態の取得を10分ごとに行うコマンドは以下の通り.
途中でnkfコマンドをはさむことで文字コードの違いをいい感じに吸収してくれる.便利.
while true; do date; curl -Ss -u admin:admin http://192.168.179.1/index.cgi/battery_main | nkf | grep small_item_td2 | grep -v input | grep -v select; curl -Ss -u admin:admin http://192.168.179.1/index.cgi/index_contents/basic_main | nkf  | grep small_item_td2| grep -v ATERM | grep -v SIM1; sleep 10m; done
出力例はこんな感じ:
    * 2019年  o月  x日 金曜日 20:22:54 JST
    * <td class=’small_item_td2′>充電中</td>
    * <td class=’small_item_td2′ colspan=’2′>インターネット利用可:3G(DOCOMO)</td>
    * <td class=’small_item_td2′ colspan=’2′>非常に強い</td>
「満充電状態で無線通信を連続して行うと勝手に充電が停止」状態だと,”充電中”という箇所が”[■■■■■■■■□□] (72%)”という風になったりする.
モバイルルータの再起動により”充電中”の表示に戻ったり,”[■■■■■■■■□□] (72%)”のままだったり.
とりあえず常時接続できているのでよしとする.
Slack連携は次のページの手順に従った.https://slack.com/services/new/incoming-webhook
web hook の作成を実行したら,bashにてcurlコマンドをたたく.https://qiita.com/lighter_mt/items/e12e2be9122ab8124fa6
例えば
sh postSlack @<userName> <botName> <message>
で,当該slackチャンネルのdirect messageのslackbotに投稿が飛ぶ.

◆そのほか2

格安SIMはDMM.mobileのライトプラン.4G/LTEだとバッテリの減りが早いかもと思ったので,モバイルルータの設定を変更して,3Gのみで使用している.

 

深層学習ことはじめ その13

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

You know more than you think you know

デジタルフォーマットについての素晴らしいところは、望むように頻繁にこの記事を更新できることです。この記事は、最新の優れた研究ではなく、基本を説明するために作成されたものです。率直に言って、そのようなものを理解することはあなたに何ヶ月もあるいはおそらく何年もの努力を要するでしょう。基本がなければ、とにかく意味があるわけではありません。さて、あなたはこの記事を読んで、「ちょっと待って – ロジスティック回帰を積み重ねてから勾配降下を行う方法だけを教えた」と考えたかもしれません。これはロジスティック回帰の実行からすでにわかっているアルゴリズムです。これの本当の美しさ。教師としての私の仕事は、学生としてあなたにとって物事が簡単に見えるようにすることです。すべてが単純すぎると思えば、私は仕事を終えました。補足として、私は彼らが何かを懸命に学ぶ必要があるように感じさせるのは人のエゴだと思います。あなたのエゴがあなたの学習の邪魔にならないようにしてください。さて、最後の章はあなたが知らないことをあなたに見せることに基づいていましたが、この章はあなたがあなたが知っていることをあなたに見せることに専念しています。ロジスティック回帰まず、ロジスティック回帰に戻りましょう。教師付き機械学習モデルはすべて同じAPIを持っていることを忘れないでください。 (X、Y)を訓練し、(X)を予測するロジスティック回帰の場合、これは簡単です。予測は次のとおりです。
y = s(Wx)

トレーニングも同様に簡単です。コストの導関数を取り、その方向に進みます。
W = W – a * dJ / dW
それでは、ニューラルネットワークを見てみましょう。予測はほぼ同じですが、追加のステップが1つあります。
y = s(W1s(W2x))
以前と同じこと導関数を取り、その方向に移動します。
Wi = Wi – a * dJ / dWi
ニューラルネットワークは任意の深さにすることができるので、W1、W2、W3などを使用できます。畳み込みニューラルネットワークはどうですか?ここでも予測は、単に1つの新しいステップを追加するだけです。
y = s(W1s(W2 * x))
*演算子は畳み込みを意味します。これは信号処理や線形システムなどのコースで学びます。

CNNをどのように訓練するのですか?実は以前と同じです。導関数を取り、その方向に動かしてください。
Wi = Wi – a * dJ / dWi
うまくいけば、ここにパターンが見えています。リカレントニューラルネットワークはどうですか?畳み込みネットを使って1つ新しいことを紹介したのと同じように、ここで1つ新しいことを紹介します。特に、最初の計算(隠れユニットの状態)が最後の値に依存するように、2つの計算を分割します。予測は次のようになります。
h(t)= s(Wxx(t)+ Whh(t-1))y(t)= s(Woh(t))
これらを訓練する方法は、コスト、そしてその方向に動くなら、あなたは正しいでしょう!
Wi = Wi – a * dJ / dWi

さて、TheanoやTensorFlowのような自動微分が可能なツールを使えば、心配することが1つ少なくなります。
W = W – learning_rate * T.grad(cost、W)
実際、ほんの一握りのニューラルネットワークアーキテクチャが「バブルアップ」した唯一の理由はここにあります。上に移動するのは、彼らがうまく行ったからです。しかし、ベンチマークデータセットのパフォーマンスが良いからといって、有能なディープラーニング研究者になることはできません。研究者が単に新しいアイデアを試みているところで多くの論文が発表されています。それらは最先端技術と比較して優れた性能を持っていないかもしれませんが、彼らは同等の性能を発揮するかもしれません、それはまだ面白いです。成功か失敗かに関わらず、すべての研究が私たちを今日の状況に導きました。人々がニューラルネットワークを何十年もあきらめたことを忘れないでください。これは創造性とより大きく考えることについての詳細です。

 

深層学習ことはじめ その12

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

教師なし学習、オートエンコーダ、制限付きボルツマンマシン、畳み込みニューラルネットワーク、およびLSTM

この時点で、あなたは私がディープラーニングの「基本」と考えるものをすでに学んでいます。これらは、より複雑なニューラルネットワークに引き継がれる基本的なスキルです。これらのトピックは、より複雑な形式ではありますが何度も繰り返されます。しかし、「あなたがあなたが知らないことを知らない」という場所にあなたを置きたくはありません。ディープラーニングについてもっと学ぶことがたくさんあります!ここからどこへ行きますか。さて、この記事は主に「教師あり学習」に焦点を当てていますが、これはほとんどの人にとってずっと理にかなっていると思います。機械に「正しく」実行する方法の例を示すことによって、その動作方法を教える一方で、何かが正しく実行されない場合は「ペナルティを課す」ことをお勧めします。しかし、ニューラルネットワークがトレーニングできる「最適化」機能は他にもあります。ラベルを必要とすることすらありません。これは「教師なし学習」と呼ばれ、k平均クラスタリング、ガウス混合モデル、主成分分析などのアルゴリズムがこのファミリに分類されます。ニューラルネットワークには、教師なし学習を実行するための2つの一般的な方法があります。それは、オートエンコーダと制限付きボルツマンマシンです。驚くべきことに、これらの教師なしの方法のいずれかを使用してニューラルネットワークを「事前トレーニング」すると、最終的な精度が向上します。ディープラーニングは強化学習(エラー関数ではなく報酬ベース)にもうまく適用されており、Flappy BirdやSuperなどのビデオゲームをプレイするのに役立つことが示されています。

特別なニューラルネットワークアーキテクチャが特定の問題に適用されてきました(この記事では抽象的な意味でデータについて話してきましたが)。画像分類については、畳み込みニューラルネットワークがうまく機能することが示されている。これらは畳み込み演算子を使ってデータを最終的なロジスティックレイヤに送る前にデータを前処理します。配列分類に関しては、LSTM、または長期短期記憶ネットワークがうまく機能することが示されている。これらは特殊なリカレントニューラルネットワークであり、最近まで研究者達は訓練するのが非常に難しいと言っていました。ディープラーニングの適用について、他にどのような分野を考えましたか?株式市場?ギャンブル?自動運転車ですか?未開発の可能性がたくさんあります。

深層学習ことはじめ その11

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

正則化

L1およびL2正則化は長い間よく知られており、ニューラルネットワークが目立つようになる前に適用されてきた。 L1正則化は、単純に、重みの絶対値に定数を掛けたものに通常のコストを加えたものです。
J_L1 = J + L1_const *(| W1 | + | b1 | + | W2 | + | b2 | +…)
同様に、L2正則化は、通常、重みの2乗に定数を掛けたものに追加されます。
J_L2 = J + L2_const *(| W1 | 2 + | b1 | 2 + | W2 | 2 +…)
これは要素ごとの二乗であることに注意してください。場合によっては、L1とL2の両方の正則化を同時に使用できます。この2つの違いは何か?どちらも無限大になることから重みにペナルティを課します(シグモイド前の活性化が可能な限り無限大に近づくことを望んでいるので、それらはやるべきことです)。
違いは、平方関数の導関数が0に近づくにつれて0になることです。したがって、L2正則化は重みを小さくすることを推奨します。しかし、それらが小さくなると、ペナルティも小さくなり、ペナルティの勾配も小さくなるため、L2正則化の影響はここでは減少します。絶対値関数の導関数は0の両側で一定です。したがって、実際に0になるまで、重みが小さい場合でも勾配は同じままです。勾配は技術的に定義されていませんが、次のように扱います。 0なので、おもみは動きません。したがって、L1正則化は、重みが0になるように推奨される「希薄性」を助長します。これは、統計学者が少数の非常に影響力のある効果に関心を持つ線形回帰の一般的な手法です。

早期停止

バックプロパゲーションを早期に停止することは、別のよく知られている正則化の方法です。非常に多くのパラメータで、あなたは過剰装備に縛られています。バリデーションセットのコストが上がると、やり過ぎになる可能性があるため、早めに作業を中止するためにバリデーションセットを使用することもできます。

ノイズインジェクション

トレーニング中に入力にランダムノイズを追加することは、さらに別の正規化方法です。通常、平均が0で分散が小さいガウス分布確率変数を選択します。これは、より多くのデータを持つことをシミュレートし、より堅牢な予測子になります。

Data Augmentation

あなたの画像のラベルが “犬”だとします。あなたのイメージの中心にいる犬は犬として分類されるべきです。右上、または左上、または右下、または左下に犬がいるように。逆さまの犬はまだ犬です。色が少し違う犬はまだ犬です。独自のデータを作成し、元のデータと手作りのデータの両方についてトレーニングを行うことで、ニューラルネットワークに同じもののさまざまなバリアントを認識させることで、より堅牢な予測子が得られます。私が上述したのは並進不変性、回転不変性、そして色不変性でした。

DropOut

ドロップアウトは、その効果のためにディープラーニングコミュニティで非常にポピュラーになった新しいテクニックです。ノイズがガウス分布ではなく、2項ビットマスクになっている点を除けば、ノイズ注入と似ています。言い換えれば、ニューラルネットワークのすべてのレイヤで、そのレイヤのノードにビットマスク(レイヤと同じサイズの0と1の配列)を乗算するだけです。通常、1(これをpと呼びます)の確率を隠れ層で0.5、入力層で0.8に設定します。これが効果的に行うことは、ニューラルネットワークのアンサンブルを作成することです。すべてのノードは「オン」または「オフ」のどちらかである可能性があるため、この手法は2 ^ N個のニューラルネットワークの集合体をエミュレートします。
ノードの値を0に設定することは、ネットワークからノードを完全に「削除」することと同じであるため、この方法は「ドロップアウト」と呼ばれます。トレーニング段階では、ノードを0に設定するだけです。予測段階では、代わりにノードの発信ウェイトにそのノードのpを掛けます。これは実際に各アンサンブルの出力を計算し、結果の予測を平均化するための近似値ですが、実際にはうまく機能します。

1つの問題

これらすべての方法に共通する点は何か? うまく機能しますが、それでも大きな問題が1つあります。それらは、モデルにハイパーパラメータを追加することです。 したがって、ハイパーパラメータ検索空間はさらに大きくなる。

深層学習ことはじめ その10

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

現代の手法による逆伝搬の改善 – 運動量、適応学習率、および正則化

ここで説明するテクニックはすべて簡単に説明できます。しかし、この単純さはそれらの有用性を隠し、少し誤解を招く可能性があります。しかし、私たちがここで行っているのはコンピュータサイエンス、つまりプログラミングであることを忘れないでください。

Momentum

勾配降下における運動量は、物理学における運動量のように働く。あなたがすでに特定の方向に動いていたならば、あなたはその方向に動き続け、あなたの運動量によって進められます。運動量は最後の体重変化として定義される。次の重みの変化は、重みに関するコストの勾配と運動量の両方の関数です。
w(t)= w(t-1)+ mu * v(t) – learning_rate * dJ(t)/ dw
ここで、muは運動量パラメータと呼ばれます(通常は0.99前後に設定されます)。これを次のように単純化することができます。
dw(t)= mu * dw(t-1) – learning_rate * dJ(t)/ dw
そして、
w(t)+ = dw(t)の運動量は学習プロセスを大幅にスピードアップします。適応学習率適応学習率には多くの種類がありますが、それらはすべて1つの共通のテーマを持っています – 時間とともに減少します。たとえば、10エポックごとに学習率を半分にすることができます。例えば
if epoch%10 == 0
:learning_rate / = 2

inverse decay

learning_rate = A /(1 + kt)もう1つの方法は指数関数的減衰です。learning_rate = A * exp(-kt)より現代的な適応方法はAdaGradです。これは重みの変化のキャッシュをこれまでのところ保持することを含みます。各重みの各次元には独自のキャッシュがあります。 cache = cache + gradient * gradient Numpyの規約に従って、要素ごとの乗算があることに注意してください。
w -= learning_rate * gradient /(sqrt(cache)+ epsilon)
ここで、epsilonは0で割ることを避けるために10 ^ -10のような小さな数です。研究者達はAdaGradがしばしば勾配が大きくなりすぎることを発見しました。 RMSpropはAdaGradに似たもう1つの方法で、キャッシュが「リーク」しています(つまり、以前の値のほんの一部しか保持していません)。この場合、cache = decay_rate * cache +(1 – decay_rate)* grad ^ 2そして、重み更新の公式は変わりません。

深層学習ことはじめ その9

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

TensorFlow

TensorFlowは、Googleが開発したTheanoよりも新しいライブラリです。それは、勾配を計算することのように、私達にとってTheanoのような多くの素晴らしいことをします。この最初のセクションでは、Theanoで行ったような基本的な機能、つまり変数、関数、および式について説明します。 TensorFlowのWebサイトには、ライブラリをインストールするために使用できるコマンドがあります。バージョン番号は変更される可能性があるので、ここには含めません。 TensorFlowをインストールしたら、Theanoと同じように単純な行列乗算の例を行います。いつものようにインポートする:
import tensorflow as tf

TensorFlowでは、タイプを指定する必要があります(Theanoのvariablesが TensorFlowのplaceholderに対応します):
A = tf.placeholder(tf.float32, shape=(5, 5), name=’A’)
ただし、shapeとnameはオプションです。
v = tf.placeholder(tf.float32)
TensorFlowでは ‘matmul’関数を使います。私はこの名前が ‘dot’よりも適切であると思います。
u = tf.matmul(A、v)
Theanoと同様に、変数の値を「フィード」する必要があります。 TensorFlowでは、「セッション」で「実際の作業」を行います。

output = session.run(w, feed_dict={A: np.random.randn(5, 5), v: np.random.randn(5, 1)}) print output, type(output)

Tensorflowにおける最適化

TensorFlowの2次式を最適化します。答えを手で計算する方法をすでに知っているはずなので、これはTensorFlowコーディングを強化し、ニューラルネットワークをより快適にコーディングするのに役立ちます。 TensorFlow変数を作成することから始めます(Theanoではこれは共有になります)。
u = tf.Variable(20.0)
次に、コスト関数/式を作成します。cost = u * u + u + 1.0オプティマイザを作成します。
train_op = tf.train.GradientDescentOptimizer(0.3).minimize(cost)
これはTheanoと大きく異なる部分です。 TensorFlowは勾配を計算するだけでなく、パラメータの更新を指定しなくても全体の最適化を行います。これのマイナス面は、あなたがグーグルが実行した最適化方法にこだわっていることです。 RMSProp(適応学習率法)やMomentumOptimizer(過去の体重変化の速度を使って極小値から抜け出すことができる)など、純粋な勾配降下法の他にもさまざまな種類があります。フォーラムの投稿でNesterovの勢いが現在進行中であることが示されているので、私はその全リストが近い将来更新されると思う。次に、変数を初期化するためのopを作成します(この問題では、単に「u」です)。

init = tf.initialize_all_variables()
with tf.Session() as session:
session.run(init)
for i in xrange(12):
session.run(train_op)
print “i = %d, cost = %.3f, u = %.3f” % (i, cost.eval(), u.eval())

TensorFlowにおけるニューラルネットワーク

入力変数、ターゲット変数、重み変数を作成しましょう。バイアス条件は省略しました。また、Theano shared = TensorFlow変数に注意してください。X = tf.placeholder(tf.float32、shape =(None、D)、name = ‘X’)T = tf.placeholder(tf.float32、shape =(None、K) )、name = ‘T’)W1 = tf.Variable(W1_init.astype(np.float32))W2 = tf.Variable(W2_init.astype(np.float32))混乱のようなので繰り返しましょう – A Theano variable!= TensorFlow変数。可変サイズ、つまりバッチサイズ、テストセットサイズなどを渡すことができるようにするために、シェイプに「None」を指定できます。では、出力を計算しましょう(隠れ層の非線形性としてReLUを使用しています。これはシグモイドやソフトマックスとは若干異なります。Z = tf.nn.relu(tf.matmul(X、W1))Yish = tf.matmul(Z、W2)最終ソフトマックスステップ。これを行わないのは、それがコスト関数の計算方法に含まれているからです(つまり、TensorFlow関数がどのように機能するのか)。この変数をsoftmaxにしたくないのは、事実上2回softmaxを実行することになるからです。次のようにコストを計算します。cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(Yish、T))
TensorFlowのドキュメンテーションを十分に参照することで、これらの関数はおそらくなじみがなく外来のものに見えるかもしれませんが、あなたはそれらに慣れていくでしょう。 Theanoの例と同様に、train関数とpredict関数も作成します。train_op = tf.train.RMSPropOptimizer(learning_rate、decay = 0.99、momentum = 0.9).minimize(cost)predict_op = tf.argmax(Yish、1) Theanoとは異なり、重み更新式を指定する必要すらありませんでした。あなたはほとんどいつもw + = learning_rate * gradientを使うつもりなので、それは一種の冗長であると言うかもしれません。ただし、適応学習率や運動量などのさまざまな手法が必要な場合は、Googleの責任になります。幸いなことに、彼らのエンジニアはすでにRMSProp(適応学習率用)と運動量を含んでいます。これらは私が上で使用したものです。それらの他の最適化機能について学ぶためには、それらのドキュメントを参照してください。 TensorFlowでは、すべての変数オブジェクトを初期化するために特別な関数を呼び出す必要があります。 init = tf.initialize_all_variables()そして、最後に、セッション内で、トレインを実行し、関数をループで予測します。tf.Session()をsession:session.run(init)として使用します。 xrange(max_iter):xrange(n_batches)内のjに対して:Xbatch = Xtrain [j * batch_sz:(j * batch_sz + batch_sz)、]

Ybatch = Ytrain_ind [j * batch_sz:(j * batch_sz + batch_sz)、] session.run(train_op、feed_dict = {X:Xbatch、T:Ybatch})、j%print_period == 0:test_cost = session.run(コスト) 、feed_dict = {X:Xtest、T:Ytest_ind})予測= session.run(predict_op、feed_dict = {X:Xtest})print error_rate(予測、Ytest)ここでもバッチグラジエントディセントを使用しています。 error_rate関数は次のように定義されています。def error_rate(p、t):return np.mean(p!= t)Ytrain_indとYtest_indは以前と同じように定義されています。