Elasticsearch×Kibana②構築した環境を触ってみる
目次
1.概要
1.1 本ページについて
・AWS認定の時に出てきたElasticsearch×Kibanaの学習に関するメモ。
1.2 前提
・環境構築が終わっている。
・logファイルやEXCEL、CSVなどをアップロードして解析するレベルを試す。
リアルタイムでの取り込みまでは試さない。
2.準備
2.1 kibanaにログイン → 簡単なCSVを取り込んでみる。
①kibanaにログインすると以下が表示されるので「Add integrations」を選択。

②とりあえず「Upload a file」を試す。「CSV」と検索すると絞り込めた。

③ファイルのアップロード画面が出てきた。

④試しに、タイタニック号の乗客リスト(CSV)を取り込ませてみる。
※乗客リスト(CSV)※github.com
⑤取り込めた。ファイル形式は正しく分析できている。

⑥Override settings から列名を変更できそう。日本語にする。
⑦importボタンを押下するとインポートできた。
この4項目から可視化を行えそう・・。

Elasticsearch×Kibana 学習中トラブルシューティング&Tips
目次
1.概要
1.1 本ページについて
・AWS認定の時に出てきたElasticsearch×Kibanaの学習に関するメモ。
→トラブルシューティングをまとめるページ。
1.コンテナをバックグラウンドで起動させる
【事象】
コンテナをフォアグラウンドで起動すると、
・1コンテナしか起動できない。
・ホストに戻るため停止が必要になってしまう。
バッチ処理のコンテナであればよいが、今回は常時起動させておきたいので、
バックグラウンドで起動してもらう(dettach)
【対応】
デタッチで起動することをデフォルトにしたいので、いったん削除して、再度runする。
sudo docker rm -f kib01
sudo docker rm -f es01
sudo docker run -d --name es01 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.13.4
sudo docker run -d --name kib01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.13.4
2.サーバ起動時に、コンテナを自動開始起動させる
サーバ起動後、毎回コンテナの手動起動が必要になっていた。
sudo docker start es01
sudo docker start kib01
面倒なので、自動起動に変更する。
sudo docker update --restart=always kib01
sudo docker update --restart=always es01
Elasticsearch×Kibana①EC2×Dockerで環境構築してみる
目次
1.概要
1.1 本ページについて
・AWS認定の時に出てきたElasticsearch×Kibanaの学習に関するメモ。
(EC2内に環境を構築してみる)
1.2 前提
・手元のPCのリソースが弱いのでEC2で構築してみる。
※使わないとき停止できるので、月額1000円以下で学習できると思う・・。
・以下を参考に、必要に応じて改変する。
2.準備
2.1 EC2のインスタンス作成
①ソフトウェアイメージ (AMI):
Canonical, Ubuntu, 24.04 LTS, amd64 noble image build on 2024-04-23
ami-0b9bc7dcdbcff394e
②インスタンスタイプ:
t2 medium
→ 1時間0.06$くらい。ディスクは15GBにしてみた。
③作業方法:
EC2 Instance Connectを使用。
(SSHを自身のIPからのみ有効にして・・が不要になる)
2.2 Elasticsearch×Kibanaのセットアップ
①dockerインストール
sudo snap install docker
→インストール成功。
docker 24.0.5 from Canonical✓ installed
②ネットワーク作成
sudo docker network create elastic --subnet=172.19.0.0/24
※dockerのマニュアルに沿ってサブネットを明示した。
network コマンドを使う — Docker-docs-ja 24.0 ドキュメント
ネットワークの作成時は --subnet オプションの指定を強く推奨します。
③ElasticsearchとKibanaのイメージ取得+起動
sudo docker run -d --name es01 --net elastic -p 9200:9200 --ip 172.18.0.2 -it -m 1.5GB --restart=always docker.elastic.co/elasticsearch/elasticsearch:8.13.4
sudo docker run -d --name kib01 --net elastic -p 80:5601 --ip 172.18.0.3 --restart=always docker.elastic.co/kibana/kibana:8.13.4
※考慮した点※
1.ElasticsearchをIP固定にする。(kibanaとの接続の兼ね合い)
IP重複が発生すると起動失敗するため、他コンテナもIP固定にする・・。
調べれば回避できるはずだが、とりあえず先に進める。
2.バックグラウンドで起動する:-d
3.自動起動する:--restart=always
4.kibanaはホストの80番ポートで着信させる。
ポート番号入力するのが面倒なので・・。
④以下チェックは省略した(本当は実施した方がよいが・・)
wget https://artifacts.elastic.co/cosign.pub
sudo cosign verify --key cosign.pub docker.elastic.co/elasticsearch/elasticsearch:8.13.4
※kibanaのチェックも省略した。
⑤バックグラウンドで起動したので、
elasticのパスワードとトークンを再出力させる。(ただ値を楽に取得したいだけ)
sudo docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
sudo docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
⑥「http://0.0.0.0:5601/」でkibanaに接続。
必要に応じてEC2で利用しているセキュリティグループを編集する。
⑦接続するとまずは初期設定。
・トークンを入力。
ーー以下、やめた案ーーーーーーーーーーーーーーーーーーーー
・・せっかくdockerを利用するので、IPアドレスでなくコンテナ名で接続する。
「https://172.18.0.2:9200」のようにIPアドレスにすると、
es01コンテナのIPアドレスが変わると動作しなくなるため。
・以下の手動設定にてコンテナ名で設定する。

・「https://es01:9200」とする。

→ 疎通できたものの、ESの証明書エラーとなり設定できない。
やむなくESのコンテナのIPアドレスを固定にする方針に変えた。
(HTTPSを使わない設定もできそうだが、今回はこの方針とする)
ーー以上、やめた案ーーーーーーーーーーーーーーーーーーーー
・パスワードを求められるので、再出力したパスワードを入力。
・認証コードを入力。

「sudo docker exec -it kib01 /usr/share/kibana/bin/kibana-verification-code」
の結果を入力すればよい。
⑧ようやくWelcome to Elastic が表示された・・。
ID:elastic
パスワード:⑤で出力したパスワードでログインできる。

⑨叩いてみよう・・!と思ったが、まずはAdd Integrationsにて設定が必要みたい。
環境を立てることができたので、続きは次の記事に書く。

楽天ひかり(クロスパス回線)×バッファロー製の無線ルータが突如インターネットにつながらなくなった
結論
- PPPoEで解消したがIPv6を使いたい・・
落ち着いたら無線ルータ買い替えを考える。
目次
1.事象
2024年5月下旬、自宅ネットワークが突然インターネットにつながらなくなった。
PC→無線ルータはつながるので
無線ルータ→インターネットに問題がある。
2.原因
以下の情報により、バッファロー製の無線ルータの問題※と判断。
※根本原因は不明であるが、以下にて判断した。
・バッファロー製の無線ルータ(一部)で発生
・楽天ひかり側には特に記事がなかった。
3.対応1「transixを使用する」
「クロスパスを使用する」「transixを使用する」も表示されないので困っていたが。
無線ルータの設定を「auto」→「manual」に変更したところ、
「transixを使用する」が表示されたのでそちらに設定。
インターネット通信できるようになったが、ちょっと諸事情ありボツ。
※VPN関係がうまく動かなくなった・・。
※注意※
設定後すぐに疎通確認のためにインターネットアイコンをクリックすると
「回線判別中・・」となり、結局インターネット@スタートに戻される。
→ 設定後、何もせずに10分ほど放置すると解消した。
(インターネットアイコンが更新されて疎通できている状態となった)
インターネット未接続時にインターネットアイコンを押下すると、
勝手にインターネット@スタートとして動く?ちょっと困る動作だ・・。
4.対応2「PPPoEを使用する」
正しいIDとパスワードを指定すると、すぐつながった。(一応、数分待つのが規則)
しかし名前解決が一切できなかった・・。
デフォルトで割り当てされるDNSサーバに接続できない・・。
「8.8.8.8」(Google提供のDNSサーバ)に疎通できたので
やむなく「クライアントにDNSサーバとして8.8.8.8を割り当てさせる」設定にすると
解決した。transixでは問題があったVPN関係も動作した。
5.今後の対応
ひとまずバッファローのニュースを定期的に確認するが、解決はしない気がする。
そのため、無線ルータを「クロスパスを使用する」に対応した
製品に買い替えすることを考えている。
※PPPoEでも問題ないが、楽天ひかりの月額料金が下がるわけでないのに、
IPv4(≒サービス低下)にするしかない状況のため、悩んでいる。
6.(2025年5月12日追記)顛末
バッファローがファームウェアを更新してくれていた・・!!ありがたい。
https://www.buffalo.jp/news/detail/20240730-01.html
ファームウェアを更新→元通り(IPv6ブリッジを使う)設定に戻して
fast.comで速度比較した結果、以下の通りめちゃくちゃなレベルで早くなった・・!
・元に戻す前(IPv4) :約 6.2Mbps/sec
・元に戻した後(IPv6):約 480Mbps/sec
文系卒でも合格:統計検定準1級(CBT)
結論
- 未経験でも合格可能。(1回で合格できた)
- 勉強時間は約160時間。(2023年冬~2024年春)
- ワークブック必須。過去問も必須。(最低2週は実施する)
目次
1.自分について
1.1 本投稿の目的
2024年5月に統計検定準1級(CBT)に合格したので、勉強方法などの備忘録。
1.2 自分について
1.3 受験理由
自己研鑽のため。
2.準備
2.1 ワークブック
以下ワークブックの購入は必須。www.gakujutsu.co.jp
理由:
範囲が広く、仮に過去問題を網羅しても対応しきれない
+過去問題と同じ問題がほぼ出てこない。
類似の問題でも、数値や情報が異なるので、理解しておかないと解けない。
AWS認定資格やIPAは、若干全く同じ問題が出てくるのだが・・・。
補足:
広い範囲をギュッと収めた影響なのか、説明がかなり省略されている。
1週目は例題1ページを進めるのに数時間を要することもあった・・。
(2週目は驚くくらい早くなるので、ここで諦めないことが重要)
2.2 過去問
以下問題集も購入必須。
books.jitsumu.co.jp
理由1:
ワークブックにある例題はかなり難しい。(ので、試験のイメージができない)
問題集を見て問題をイメージすることが重要。
順番に読んで「毎年全く違うじゃないか・・」と気づくことも重要。
理由2:
ワークブックに記載されている内容と同じものが、別の表現で書かれている。
それらを読み込むことで、理解を深めることができる。
補足:
こちらも説明過程が不足している。
1週目は読み進めるのに非常に時間を要する。ガリガリ書き込むべき。
3.学習方法
3.1 ワークブックを一周 → 問題集を一周する。(1周目)
ここが一番大変。とても辛い段階。
①不足している説明をググる時間が、非常に長い。
2~3時間かけて1ページ進めるという状態がザラになる。
②時間の割に正解率が上がらず、成果が見えずらい。
【この時点での点数】
①ワークブックの例題の正解率:2割。
②問題集の正解率:約5割。
→ 過去問が6年分あるが、問題が重複しておらず、一向に点数が増えない。
【コツ】
合格後にメルカリで売りたかったので、紙で購入→書き込まないつもりだったが、
難易度が高すぎるのでワークブックの途中からガリガリ書き込んだ。
→ 綺麗に使って合格してから売る・・はあきらめた方がよいと思われる。
②難しすぎるところは「2週目で解決する」とメモだけ書いて飛ばす。
→さすがに1ページ5~6時間かかるなら途中から飛ばした方がよい。
※最終的に、2周した後も理解が困難な箇所が1割ほど残った。
③指数や対数は「理解しているでしょ?」というペースでガンガン省略される。
数学知識が低いので、これがとても辛かった。
私はTry It で中学レベルの知識を1から学習した。このサイトはすごい・・!!
3.2 ワークブックを一周 → 問題集を一周する。(2周目)
1週目に「不足している説明をググる」を実施しているほど、効果を感じる。
これなら何とかなりそう・・!という希望を持てる段階。
①全く理解できなかったことが、それなりに理解できる。
②異なる表現で記載された、学習済みの内容をスッと理解できる。
③1週目で飛ばした部分を理解できる場合があり、自分の進化を感じる。
④進む速度がケタ違いに早くなる。1ページ10~30分程度。
【この時点での点数】
①ワークブックの例題の正解率:6割。
②問題集の正解率:約7割。
→ 以下のような状態になった。どちらも、 再度調べて書き込み対応した。
・1周目と同じ問題を間違える。
・「知識がないから解けた」問題を、知識が増えたから間違える。
3.3 試験範囲の確認
試験範囲が改定されていないか確認。www.toukei-kentei.jp
→ 合同行列が追加されていたので、ざっと調べて理解した。
※実際出てきたので、覚えて正解であった。
ニューラルネットワークは・・難しいのであきらめた。
※E資格合格時のノートを紛失しており、学習コストが高すぎる状態であった。
4.受験
4.1 試験前の最終確認
試験直前。一番避けたいのが凡ミスによって60点未満となること。
学習履歴から、私は以下に注意することを意識した。
①聞かれていることを意識する。(片側 or 両側、2.5% or 5%、T分布 or 分布)
→ 有意度2.5%を勝手に5%と誤解して間違える、というミスが多かったため。
②不明な問題はメタで解く。
例えば最尤値。対数尤度を解けなくても、回答は5択なので全部代入して
一番確率が高い物を回答とする。
③不明な問題は記載されている式に値を代入する。
~は~の式で定義される。という問題で、式の意味が不明な場合、
とりあえず式に値を代入して考えれば答えが分かる。
4.2 結果確認
66/100で合格した。
※後日、結果照会結果をアップする予定。
漸近正規性など、ワークブックに少し記載があるが過去問に無い、
というレベルの問題がザクザク出てきた。
恐ろしく重箱の隅をつついてくるイメージであり、幸運だったと考えている。
※予定としては、1回目は傾向を見る目的で落ちるかな、という覚悟をしていた。
受験代が浮いたので非常に良かった・・・・。
以上。
Budibase④実装に関するメモ。
- 1.本記事について
- 2.Navigation
- 3.URL variables
- 4.Plugin
- 5.Action
- 6.参照するDBの制約
- 7.Data Providerにテーブルでなくqueryを使用する場合の制約
1.本記事について
Budibaseでのアプリ開発をある程度実施して、把握した仕様や注意点を記録する。
※量が多いので、随時追記していく。
2.Navigation
各ページへのリンクを表示する機能。
リンクはURLで設定する。URL variablesも固定値なら設定可能。
②備考
ーーーーーーーーーーーーーーーー
便利だが、できないことも多い。
以下を行うの場合、自分で独自のNavigationを組み込むしかない。
・リンクを階層で表示する。
・URLやURL variablesを動的にする。
・User roles以外で表示、非表示を制御する。
練習として、階層型リンクを、開閉できるアコーディオンメニューで作ってみた。
その際は、以下プラグインを使用した。
3.URL variables
①URL variablesとは?
いわゆるGETパラメータに近い。
ページ遷移時に、変数を渡すことができる。
②備考
ーーーーーーーーーーーーーーーー
型はすべて文字列になってしまう。
「/home/:aa」 という設定で「aa = integerの1」としても、
型変換しないと文字列として扱われる。配列等も同様。
文字列以外を渡す場合は、受け取り後に型変換して保持する必要がある。
同様に「/home/null」としても「nullという文字列」が渡される。
ーーーーーーーーーーーーーーーー
ページにURL variablesを設定している場合、
「URL variables」の数まで一致させないと遷移できない。
遷移できない場合、エラーも何もなく、ホーム画面に戻される。
※もしかするとF12開発者ツールではエラーが表示されるのか?
なお、URL variablesは空白は認識されない。
例:「/home/:aa」に遷移したい場合、
「/home/あ」 では遷移してくれるが、
「/home/」 では遷移してくれない。(ホーム画面に戻される)
ーーーーーーーーーーーーーーーー
4.Plugin
①Pluginとは?
無料プランは10個まで可能)。
以下で、どんなプラグインがあるか確認できる。
5.Action
①Actionとは?
ボタンクリックや値を更新した際にキックできる処理。
実施したい処理や、渡す値を指定して使用できる。
②備考
ーーーーーーーーーーーーーーーー
「execute query」という処理で、BudiBaseに登録したqueryを実行できるが、
データをselectするqueryを実行した場合、
後続のActionで実行結果を流用できる。(ここですごく動作を拡張できる余地がある)
ただ、後続のActionで実行結果を使用する場合、
「execute query」の順番が変わると、再設定が必要になるので、そこそこ手間。
ーーーーーーーーーーーーーーーー
★重要★
Actionはあくまでもサーバベースで動作する。(とドキュメントにも記載あり)
そのため、1つの動作に以下のような2アクションを設定しても動作しない。
ーーーーー
①フォームの値を更新
②「①」をフィルタ条件に使用するDP(DateProvider)をリフレッシュ
ーーーーー
→ 結果、①は動作するが②は動作しない。(更新前の値でフィルタされる)
なお、同じボタンをもう一度クリックすると、想定通りの②が動作する。
(1回目のクリックで①の値が更新されているため)
→ 上記のような動作を実施したい場合、
ダブルクリックさせるアクションにすれば問題ないと思われる・・。
(1回目のクリックで①の値を更新、2回目のクリックでDBを更新するイメージ)
ただ、ユーザの手間は少し増える。
ちなみに、以下のような処理は1クリックで動作する。
ーーーーー
①query実行(最新の値をサーバサイドで保持した状態)
②フォームの値を「①」の結果で書き換える
ーーーーー
→ただ、結局②の値を使用する場合、ダブルクリック的な実装が必要となる。
6.参照するDBの制約
①参照するDBに必要に発生する制約
テーブルは、必ず単一列の主キーを持つ必要がある。複合主キーは不可。
もし、該当テーブルに単一列の主キーがなければ、
「ALTER TABLE dummy ADD COLUMN id bigserial;」みたいな
SQLでキーを作成する必要があり、非常に影響が大きい。
※なお、Actionでデータを保存(Save Row)するとき、以下の仕様を順守する必要もある。
・Insert時:「_id」列に空白文字を渡す。(nullでもよいかもしれない)
・Update時:「_id」列に単一列の主キー列の値を渡す。
※BudibaseDBでテーブルを作成する場合、
「_id」という一行一位の連番を持つ列が作成される。
用する場合、ダブルクリック的な実装が必要となる。
7.Data Providerにテーブルでなくqueryを使用する場合の制約
ここが、そこそこ影響が大きい。
①Tableコンポーネントの挙動。
queryを利用したテーブル項目を作成すると、
コンポーネント標準のページネーションを利用できない。
この場合、頑張ってページネーション処理を自作する必要がある。
②データのCRUD画面
queryを利用したテーブル項目を作成すると、
CRUD画面を自作する必要がある。
(Field groupコンポーネントを使うと少しだけ楽になる)
①参照するDBに必要に発生
次回:xxx
Budibase③バックアップを設定してみる。
1.本記事について
Budibaseの環境を構築できたので、バックアップの作成方法を調べた。
2.BudibaseのBackupとは
Budibase自体のユーザ情報やアプリの設定などをバックアップできる。
①Budibase自身のユーザ情報等:
→ 世代管理などを含む高度なバックアップは無料プランでは利用できないが、
CLIでできそう。やってみた内容は後述する。
②Budibaseで作成したアプリの設定等:
→ 世代管理などを含む高度なバックアップは無料プランでは利用できないが、
手動でダウンロードする形のバックアップは可能。

4.バックアップを実施してみる(Budibase自体のユーザ情報等)
Docker版は簡単。
①以下コマンドでバックアップ可能。
budi backups --export --env .env
ーーーーーーーーーーーー
CouchDB Export
S3 Export
Generated export file - backup-2023-02-26T14:15:47.377Z.tar.gz
ーーーーーーーーーーーー
②tarファイルが作成された。
ls -al
ーーーーーーーーーーーー
-rw-r--r-- 1 root root 1238428 Feb 26 14:15 backup-2023-02-26T14:15:47.377Z.tar.gz
ーーーーーーーーーーーー
※補足※
ホストの「.env」ファイルにDBのキーなどが記載されている。
こんな感じ。(キー部分は適当な乱数に置換している)
ーーーーーーーーーーーー
# This section contains all secrets pertaining to the system
JWT_SECRET=2YjG0oJ2mB7j9u7qabgdjwW6zEcrHUxT
MINIO_ACCESS_KEY=f66I9Ao4M2nYsj2OACgu5CHDBvsk4sTh
MINIO_SECRET_KEY=LxE9PWaMi5GJDIqJ1E8LixbsOxYdN6ub
REDIS_PASSWORD=9sHFDhXEtM1231FfYraWbi7bMNq9iGWM
INTERNAL_API_KEY=mPTDVgJ0NBDdGLk6keZiLHmUeB2IJws
COUCH_DB_USER=admin
COUCH_DB_PASSWORD=YYyQPn3dsaadghjwWuVZAxHrLsvzcmNe3G
ーーーーーーーーーーーー
5.リストアしてみる
①以下コマンドでリストア可能。
budi backups --import <filename> --env <environment file>
→ budi backups --import backup-2023-02-26T14:41:23.066Z.tar.gz --env .env
ーーーーーーーーーーーー
ouchDB Import
MinIO Import
Import complete
ーーーーーーーーーーーー
②ログインなどの認証情報がバックアップ時点の内容に戻ったことを確認した。
※アプリの設定変更などは戻らない。
6.タスク化してみる
簡単なタスクを作成。とりあえず毎時間作成する。
※実務利用するなら、実行タイミングや保持する世代数も検討必要。
crontab -e
ーーーーーーーーーーーー
0 * * * * budi backups --export --env .env
ーーーーーーーーーーーー
次回:本来の目的であるアプリの作成を行ってみる。
Budibase②DB環境を構築してみる。
1.本記事について
AWSにてBudibaseの環境を構築してみたので、データ保管先のDBを準備した。
その備忘録。
2.準備したDB環境
実務で想定しているpostgresql-9.6を作成。(古いが・・)
適切なイメージがあったので、これを利用する。
https://hub.docker.com/r/postgresqlaas/docker-postgresql-9.6
# コンテナイメージの取得
docker pull postgresqlaas/docker-postgresql-9.6
※既存DBを使わない、DBにこだわらない場合、
Budibaseが内包しているDBを利用できる。
3.BudibaseとDB環境の接続
以下を参考に、Budibaseのコンテナとpostgresql-9.6のコンテナ間の接続を確立する。
accessing a docker container from another container - Stack Overflow
①ネットワーク作成
docker network create myNetwork --subnet=172.18.0.0/24
※注意※
サブネットは指定必須。指定しないとランダムなサブネットが割り当てされる
公式ドキュメント参照:
network コマンドを使う — Docker-docs-ja 19.03 ドキュメント
②コンテナとネットワークを接続
docker network connect myNetwork postgresql
docker network connect myNetwork bbapps
結果は以下で確認した。
docker network inspect myNetwork
-----------------------------------------
"ConfigOnly": false,
"Containers": {
"41cb024e89e0e74c0906fd8b035357eb83f7cb005b4319bff4f036b123015740": {
"Name": "bbapps",
"EndpointID": "7896a28f69fd73b4603bb43b2e46d93974c62d56ba9be2ccf5461ccf82738336",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"7b36ed3e27e6257e400afb9c6bc892810395e2a33e667757301e83959c905a7d": {
"Name": "postgresql",
"EndpointID": "69786b1e1e8326a1b0eb971bf307da5de2a466a5043e482181457c476285b0bb",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
・
・
-----------------------------------------
4.DB環境の展開
①データを永続化するための保管先ディレクトリを作成。
mkdir -p /postgresql
②DBの展開
docker run -d --name postgresql -p 5432:5432 -e POSTGRES_USERNAME=test -e POSTGRES_PASSWORD=test_password -e POSTGRES_DBNAME=test -v /postgresql:/data --network=myNetwork --ip=172.18.0.100 --restart=always postgresqlaas/docker-postgresql-9.6
色々、入れたい設定を追加した。
1.「-p 5432:5432」ホスト:5432から接続できるようにする。
2.「-v /postgresql:/data」データを永続化するための保管先。
3.「--network=myNetwork」BudiBaseと同じネットワークに配置。
4.「--ip=172.18.0.100」起動時に毎回変わると手間なのでIPアドレスを固定。
5.「--restart=always 」インスタンス起動後、コンテナを自動起動する。
③接続確認
# psqlの利用に必要なパッケージをインストール
apt install postgresql-client
# 接続テスト
psql -h 127.0.0.1 -p 5432 -U test
-----------------------------------------
Password for user test:
-----------------------------------------
→ 問題なく接続できそう。
※補足※
本コンテナは、パスワード等未指定の場合、以下で確認可能。
docker logs postgresql
5.サンプルDB定義の投入
①psqlにて接続して、以下に記載されているサンプルSQLを実行する。
以上で、やっとBudiBaseでアプリを作成できるようになる。
次回:BudiBaseのバックアップ設定を行う。
現状undo機能がないので必須と思われる。※近日実装されるかも。
Budibase①AWSにて環境を構築してみる。
1.本記事について
AWSにてBudibaseの環境を構築してみたので、その備忘録。
※AWSで構築しようとした背景※
・学習目的。
・自分のPCのスペック的に、ローカルに構築するのが厳しいため。
2.Budibaseとは
いわゆるローコードの開発ツール。
プログラミング言語とか知らない人でも簡単にツールを作成できる。
一度手を出してみたいと思って選定したが、
Budibaseがオープンソースでよさげなので採用した。
3.まずはEC2インスタンスの作成
①インスタンスタイプはt2.mediumにする。
メモリ4GBあれば足りるだろう、という推測。

②AMIは以下。ubuntu初めてだが何とかなるだろう。
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) Start――
Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2023-02-08
Canonical, Ubuntu, 24.04 LTS, amd64 noble image build on 2024-04-23
(AMI ID:ami-0b9bc7dcdbcff394e)
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) End――
なにか問題あれば、OSは後で差し替えする。
(Budibase自体はDocker版を利用するので問題ないと推測)
→ 20時間1ドルくらい。学習中のみ起動するので、費用的にも問題ないはず・・
③セキュリティグループの設定。
Budibaseのデフォルトのポート番号「10000」を、自IPからのみ接続可能にする。
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) Start――
④ConsoleはSessionManagerを使用する。
AWS Systems Manager Session Manager - AWS Systems Manager
⑤インスタンスを起動してSessionManagerで接続できれば準備完了。
→ AWS認定資格の学習がめちゃくちゃ役立っている。
④EC2 Instance Connectでの接続準備。
セキュリティグループの設定を変更して、22番ポートの着信を許可する。
もちろん「0.0.0.0.0/0」は危険すぎるので、
AWSがEC2 Instance Connectのために利用するアドレス範囲※だけ許可すればよい。
※以下の「{使用リージョン}かつ"EC2_INSTANCE_CONNECT"」のアドレス範囲
https://ip-ranges.amazonaws.com/ip-ranges.json
⑤EC2 Instance Connectで接続する。
※毎回sudo付与するのが手間なので、ユーザ名は「root」を選択する。
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) End――
4.EC2インスタンスにBudibaseをインストール
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) Start――
dockerで構築する場合のドキュメントが追加されていた。
以下のコマンドを順番に実行すれば構築完了した。すごい簡単になってる・・。
(上記に、必要なパッケージを構築する手順を加えたもの。)
―――――――――――――――
apt update
apt install npm
apt install docker-compose
docker run -d -t --name=budibase -p 10000:80 -v /local/path/data:/data --restart unless-stopped budibase/budibase:latest
―――――――――――――――
――2024/06/08 更新(ubuntu 24 でやり直した時のメモ) End――
以下の手順通り、Dockerでインストールを行う。
※注意※
以下にも方法が記載されているが、不十分。(Ver.14~のNodeJSが必要など)
https://account.budibase.app/portal/install/docker
①必要なパッケージのインストール
#準備
apt update
#Ver.14以上のNodeJSをインストール
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
apt install nodejs
#結果確認
node -v → v14.21.3
#必要なパッケージを追加
apt install npm
apt install docker-compose
②BudiBaseインストール
npm install -g @budibase/cli --unsafe
※以下のエラーへの対応として、--unsafe オプションを付与した。
gyp WARN install got an error, rolling back install
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/@budibase/cli/node_modules/bcrypt/.node-gyp'
③BudiBase初期化
budi hosting --init
何個か設定の入力を求められるが、問題なく成功した。
? This will create multiple files in current directory, should continue? Yes
? Please enter the port on which you want your installation to run: 10000
Configuration has been written successfully - please check /root/.env for more details.
※ポート番号は「Registered Port Number」の範囲なら何でも良いはず。
⑤BudiBase起動
budi hosting --start
数分待ったら完了した。
Services started, please go to http://localhost:10000 for next steps.
⑥疎通確認(EC2インスタンスから接続)
問題なさそう。
Redirecting to <a href="/builder">/builder</a>.root@ip-172-31-36-57:~#
⑦疎通確認(自分のPCから)
WEBブラウザで以下に接続。
・http://"EC2インスタンスの「パブリック IPv4 DNS」":10000
ログイン画面が表示されたので、問題なし。

⑧管理者アカウントを作成したら、ログインできる。
これでとりあえずの環境作成は完了。
次回:接続先となるDB環境を構築して、Budibaseと接続する。
機械翻訳があっても英語を勉強する理由(Google翻訳とDeepLで結果が反対になった話)
最近、AWSの学習中だが、基本的に英語のドキュメントが多い・・。
DeepLとかで一括翻訳して読もうと思ったが、英語の勉強も兼ねて
・とりあえず英語で読んでみる
・分からない単語や文脈だけ都度調べる
とやっている。
すると、少し怖いことがあった。
以下はCloudFormationに関する学習文書。
以下の文章を、Google翻訳とDeepLで翻訳すると意味が真逆になる。
―――――
Stack policies help protect critical stack resources from unintentional updates that could cause resources to be interrupted or even replaced
―――――
―――――
スタック ポリシーは、重要なスタック リソースを意図しない更新から保護し、リソースの中断や置き換えを引き起こす可能性があります
―――――

②DeepL
―――――
スタックポリシーは、リソースの中断や交換の原因となる意図しないアップデートから、重要なスタックリソースを保護するのに役立ちます。
―――――

確認した結果、DeepLの方が正しいと分かったが、
今後DeepLが100%正しい翻訳をしてくれるわけじゃないと思う。
※無料で使っているので、誤訳があっても、責任を問うつもりは全くない。
仕事で技術文書を翻訳かけて読んでいるとして、
急いでいる時、疲れている時、この誤訳に気付けるか。ちょっと怖いと思う。
最低限の英語力をつけて、
「この翻訳おかしくね?」と気づけることが必要だと思った。
(CKA CKAD共通)新しいプラットフォームのCKA試験を受けた結果、ひどい目にあったので返金してもらった話
結論
- 2022年6月から試験プラットフォームが変わっている
- 日本からの受験時は試験環境が東京リージョンで起動する。
- 大阪から平日、受験したらネットワーク遅延で試験どころではなかった。
- 今のこと大阪リージョンの対応予定はないとのこと。
目次
1.自分について
1.1 本投稿の目的
昨年CKADに合格。今年CKAを受験したが、ネットワーク遅延で試験どころではなかった。試験機関に問い合わせた結果、2022年6月から試験プラットフォームが変わっていることが原因と思われるので、その点の共有。
※多分、東京やその付近から受験する場合は問題ないと思っている。
1.2 受験までの経緯
昨年CKADに合格したので、今年はCKAを取ろうと決意して、去年バウチャーを購入。
2022年5月~7月まで勉強して、先日、自宅から試験を受けた。
2022年6月から、試験環境が新しくなる(PSI Bridge)とのことだが、特に問題ないと思っていた。
2.1 発生したトラブル①セキュアブラウザ起動後、WEBカメラを変更できない。
(影響:致命的ではない。が、受験が30分ほど遅れた)
新しい基盤での試験は、専用のセキュアブラウザをインストールして利用する。
※他のアプリを立ち上げできなくなったので、不正防止には非常に良いと思った。
ただ、起動時、使用するWEBカメラを1台だけ選ぶ。
私のPCは前面背面、2つのカメラがあったが、試験中は自分を表示するため前面を選択。
これが不幸の始まりだった・・・。
クレジットカード等の証明書をカメラに移す必要があるが、
前面のカメラではピントが合わない。(背面は画質が良いので一瞬でピントを合わせることができる)
チャットにて、英語で「助けて!WEBカメラ切り替えさせて!」と言っても
特に対応してもらえず。方法も教えてもらえず。
やむなく、こちらから強制的にセキュアブラウザを落として、背面カメラを指定した。
が、背面カメラでは、自分を映しながら試験を行う事は不可能。
急遽、外付けディスプレイを用意して、PCは後ろ向きにして受験することになった。
(=外付けディスプレイが無ければ受験不可能だった・・・)
ただ、本トラブルは、以下の機能を調べて、利用すれば対応できた可能性はある。
・セキュアブラウザでのカメラ切り替え(方法があるなら)
・PCのカメラのピント合わせ等
致命的なのは次のトラブルだった。
2.2 発生したトラブル②ネットワーク遅延がすごすぎて試験にならない
新しい試験プラットフォームでは、
セキュアブラウザから、リモートデスクトップ環境(ubuntu)に接続して作業する。
厄介なのが、以下が、リモートデスクトップ環境からのみ可能な点だ。
・ドキュメントの閲覧
・コマンドの実行
・メモ帳によるコマンドの作成
セキュアブラウザに以下の2画面を表示するイメージだ。
ブラウザの左半分:問題の表示
ブラウザの右半分:リモートデスクトップ環境の表示
ここで何が起こったかと言うと・・・ずっと遅いのだ。
リモートデスクトップ環境だけが。
マウスのクリック、スクロール、キーの入力。全てに3~6秒ほどタイムラグがある。
一番最悪なのは、ドキュメントの閲覧。
画面のスクロールが、1スクロール10秒以上要する。
実質、ドキュメントを参照できない。
試験の後半1時間はさらにひどく、感覚的に上記の約1.5倍の遅延となった。
ここでも、チャットで助けを求めても、何も対応してもらえない。
ブラウザをリフレッシュしろ、と言われたが、何回リフレッシュしても変わるわけがない。
当然だ、ブラウザの左半分は全く問題ないのだ。
明らかに、ブラウザの右半分、リモートデスクトップ環境だけ遅い。
結果、試験の進行はひどかった。
120分中、60分ほど、待ち時間だった。何もできなかった・・。
私のネットワークに問題ない、という証拠はある。
試験前:youtubeでFHDの動画見ながら学習。特に遅延なし。
試験後:速度測定のサイトに接続して速度測定→100M/bpsという結果。
あきらかにリモートデスクトップ環境に問題があったのだ。
3.1 試験結果と問い合わせ
試験結果が届いたが、64/66で不合格。当然、納得できるわけがない。
調べた結果、新しいプラットフォームにて、ネットワーク遅延に関するトラブルが色々あるようだった。
(①リモートデスクトップ環境が、試験場所と異なるリージョンで起動される問題※修正済み)
(②試験中、通信が遅すぎる・・みたいな話)
I had the worst experience during de CKA exam because of the awful psi plataform. : kubernetes
linuxfoundationに質問することにした。
3.2 問い合わせの回答
やり取りを要約した結果は以下の通り。
※連絡~回答は1サイクルで2営業日ほど要する。
以下のため、非常にストレスがかかった。
①途中、質問の誤回答があったが、それに関する説明が一切ない。
②こちらの環境の責任にしてくる。(明確な根拠を書いているのに・・!と思った。)
――――――
質問の概要:
リモートデスクトップ環境が遅すぎる?どのリージョンで起動した?
――――――
(linuxfoundation,以下lf)
受験時、タイムゾーンに「Asia/Japan」を指定してたね!
結果、日本外のリージョンでリモートデスクトップ環境が起動したよ!
ネットワークが空いている時間帯に受験してね!
無線LANは接続が不安定だよ!
ブラウザの動作が遅かった場合、画面の解像度などを下げてね!
(私)
どのリージョンで起動したの?
日本のリージョンに対応する予定はありますか?
この状態は、バウチャー購入時に無かった情報であり、
昨年CKADを受験したときも発生していなかった問題なので、
対応予定がなければ返金していただきたいです。
日本は島国だから、他のリージョンで起動してたら、海をまたぐ通信になるので遅くなると思います。
私の方のネットワークや環境の原因にしないでください。
(lf)
リモートデスクトップ環境は、東京リージョンで起動してたよ!
試験中、常にネットワーク遅延が発生していて、pingのレスポンスに200ミリ秒以上を要していたよ。
試験後半は、1000ミリ秒を超えることもあったよ!
ブラウザの動作が遅かった場合、画面の解像度などを下げてね!
(私)
さっきと回答違いますね。私は大阪から受験しました。大阪~東京は、数百キロあるので、
その距離が遅延の原因ですよね?大阪リージョンで起動する方法を教えてください。
あと、二度と、私の方のネットワークや環境の原因にしないでください。
以下により、リモートデスクトップ環境に起因した遅延と特定しています。
①試験前:Youtubeで高解像度の動画を、遅延なく閲覧できていました。
②試験中:リモートデスクトップ環境以外(試験問題)は問題なく参照できました。
③試験後:インターネットの速度測定サービスにて確認した結果、100M/bpsの速度でした。
最後に、pingが1000ミリ秒以上要するって、大変な遅延ではないですか?その状態で作業した事はありますか?
(lf)
大阪リージョンを指定する方法は、ないよ!(タイムゾーンで指定したリージョンで起動するよ!)
今後も東京リージョンで起動する場合、返金するよ!
回答が間違っていたのは、初めは一般的な回答、その次に詳細に確認した回答を行ったからだよ!
今回は、ネットワーク遅延が原因なので、無料で再受験できるようにするよ!
(私)
回答が一般的とか、一般的でないとかどうでもいいです。
間違ってたのに、訂正の一言もないのですか?
再受験しても遅延するなら意味が無いです。
1回の受験に2時間要する事はご存じですよね?
もう質問する意味がないので、返金していただけますか?
(lf)
返金するよ!
3.3 現在の状況
返金待ちの状態。
学習した時間や試験時間、試験用の会議室の予約料、
すべて無駄になるので悔しいが、損切りすることにした。
3.4 気になる事
単なるクレームでなく、他の地域から受験した場合の動作が気になります。
・リモートデスクトップ環境は東京リージョンで起動するので、
東京や関東での受験なら問題ない?
・他の地域でも、インターネットが空いている時間、例えば深夜や早朝なら問題ない?
以上
資格試験に合格したので勉強法を残しておく:E資格
結論
- 勉強時間は250時間。→過剰だったかも。
- 受験費が高い(最低33,000円。+ 認定講座が高い)。
目次
1.自分について
1.1 本投稿の目的
E資格(JDLA Deep Learning for ENGINEER 2022 #1)に合格したので、
勉強方法の備忘録。
1.2 受験前の知識
1.3 受験理由
何年か前、「AIを使えば、ある文書と類似する文書を表示する」とかできるのでは?と考えて失敗し、大量の時間を無駄にした。
→ 知識が全くなく、ググって出た「~モデルを使って~してみた」を
コピペして試す、の繰り返し。中身を一切できていないので改善もできず、失敗から何も得ることもできず。
→ この反省から「AIを理解すればもう少しまともな方法とれたのでは?」と考えて、受けようと決めた。
2.勉強
2.1 認定講座の選定
目的:受験資格を得ること。
この試験は、大学の単位に近い物があり、まず、受験資格を得る必要がある。
認定講座は色々あるが、結構高い。(12万円~50万円くらい)
まず、専門実践教育訓練、という制度を発見した。
これに該当する講座は、最大70%、国がお金を出してくれるらしい。
なので、50万円→自己負担15万円、というイメージ。
※一応、普通の会社員なら、2~3年に1回だけ使える制度。
事前にハローワークで申請必要なので、その時、聞くのが良いはず。
ただ、今回は見送った。
専門実践教育訓練を利用するにはキャリアカウンセリングを受ける必要があり、
・ハローワークで受ける:
無料だが、基本は平日の日中しか予約できない。
・企業や個人(キャリアカウンセラー?)などで受ける:
有償だが(1万円くらい?)、土日夜間でも受けれる。
コロナによる保育園休園
→ 子供の家庭保育、で有給が無いのだ・・。試験費高いからお金も抑えたい。
ということで、以下を受けてみた。
初期費用2.2万円、月額3千円で受けれるサービス。
半年くらいなら、5万円くらいで受講できる。
※宣伝ではない。少なくとも、今の時点では・・←
値段だけで決めて色々困ったので、後でデメリットを色々書く。
2.2 認定講座の受講(約150-200時間)
上記の講座[ラビットチャレンジ]を半年受けた。
基本的には、以下を4セット実施(応用数学、機械学習、深層学習1、深層学習2)。
- 講座(動画)を見る。
- 受講した証明のため、ブログに内容 + 自分の考えを書く。
- 一定数の講座完了後、確認テストを合格する。
→ 3が大変で、4択問題だが、95%正解しないと、次に進めない。
問題が多いと、以下のような内容になる。
問題数 :100問
必要な点数:95点
さらに、
一定回数(10回目?)以上の受験:5回4千円の追加課金。
誤答の開示:1回4千円の追加課金。
これで、誤答の開示を2回実施した。つまり、約8千円追加で費用が発生した。
費用を抑えるためにこの講座を選んだのだが・・。
(まあ、それでもトータルでは、他の講座より格段に安いが・・)
2.3 認定講座が提供する模擬試験の実施(約30.0時間)
これは、価値があった。
・模擬試験
・出てきそうな問題に重点を置いた動画
・JDLAが作成した公式例題
があり、実際の試験で、結構な割合で類似の問題が出てきた。
さらに、「JDLAが作成した公式例題」の知識で回答できる問題も数問あった。
(実際の試験内容は書けないルールなので書かない)
3.受験
3.1 受験
- 講座の受講完了後、できるだけ早く受験センターを予約すること。
試験日が金~土曜日だが、最悪金曜日しか申し込みできなくなる。 - 受験後、結果は三週間待つ必要がある(オンライン受験なのになぜ?と思ったが・・)。
→2時間で全問回答。結構ギリギリで完了。
※とりあえず一周。時間がかかる問題は後から確認するべき。
あと、メモ用のホワイトボードは早めに交換してもらう。
3~4回交換してもらった。(イレーサー貸してくれたらいいのに・・)
3.2 結果確認
2月19日受験で約三週間後(3月11日)、メールが届いた。

→合格。良かった。平均80%くらい?。60%がボーダーという情報があるが実際は不明。
落ちたら金銭面がまずいので助かった。
4.最後に
4.1 シラバスの改定について
次回(2022年8月)以降、シラバスが大きく変わるらしい。
※「詳細な試験範囲はこちら」を参照
4.2 今回選んだ講座について
今回選んだ講座については、本当に安かろう微妙かろうだな、と思った。
メリット:
①安い。
②模擬問題がある
③講師が選んだ重点説明の動画がある。
→とにかく①が強い。多分。②③はどの講座にもあるのでないか。
デメリット:
①確認テストが辛い
正解率95%が必要、一定回数以上の実施、誤答の開示が有償
→ まあ、難しい問題とは思う。無制限に受講できて誤答の開示が無料なら、
力ずくで100%とることも可能なので・・。
②質問できない(不明点は自分で解決してください。だから安価です、という形)
→ まあ、HP上でも書かれているので、これに文句を言うのはおかしいか。
③資料(画像)とテキストが一部違う。
→ 資料と選択肢の変数名が違っている場合があり、
何回か「これ何?」となった。これは結構いらいらする。
④シラバスの改定について、事前の情報提供が無かった。
→ これ、信頼関係的に一番疑問に思ったかもしれない。
基本的に、E資格の受験資格は2年間保たれるので、受験資格を得た後、即解約しても良い。
今回落ちたら、次の試験はシラバス改定後になるので、
一部講座の再受講が必要になる(必須でないが受けないと試験で対応できない)が、月額制でない講座は、そのあたりも無料で継続受講できる救済措置がある。
しかし、ラビットチャレンジは月額制なので、その分、単純に利用月が増える=出費が増えるのだ。
月額制という特徴を踏まえたら、受講者に一言説明が必要では?と思った。
4.3 もし次受けるなら
講座は変えるかもしれない。色々調べたが、これが良いかも。
全人類が分かる・・なので、落ちたらどうしようと思うが・・。
※宣伝ではないので、各自、絶対に適切な講座を調べた方が良い。
人により、何を優先するか違うはず。
・費用を抑える(サポートが弱いので、自分で色々調べる必要がある)
・サポートを充実させる(費用は高くなるが、合格サポート、とかもある)
・専門実践教育訓練を使う(申請が色々大変だが、使えるならありがたい)
誰かの参考になれば、うれしいです。
※記載していないですが、文部科学省の資料(行列計算)なども参考になりました。
コメント頂いたら情報を追記するようにします。
以上。
E資格の勉強⑥深層学習day4
目次
本投稿の目的
深層学習(day4)に関する学習のまとめ
Section1:強化学習
【要点】
強化学習:
最終的な報酬を最大化する、というエージェントを作ることを目的とした機械学習。
→ 競技プログラミングで例えると動的プログラミングのイメージ。
例:顧客が100人存在するとして、誰にキャンペーンのメールを送るか。
上記の場合、「キャンペーンの売り上げ - 送るコスト」 を最大化するようなエージェントを作成する。
・ 全員に送ると送るコストが不要に大きくなる。
・ 全員に送らないとキャンペーンの売り上げがない。
→ 最適な行動を見つける必要がある。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。www.tcom242242.net
――――――――――――――――――――――――
演習①4×4の迷路。ゴールに到着=報酬100。トラップに到着=報酬-100。
――――――――――――――――――――――――
情報:迷路の状態
self.filed_type = {
"N": 0, # 通常
"G": 1, # ゴール
"W": 2, # 壁
"T": 3, # トラップ
}
self.map = [[3, 2, 0, 1],
[0, 0, 0, 2],
[0, 0, 2, 0],
[2, 0, 2, 0],
[0, 0, 0, 0]]
情報:使用した設定
# 定数
NB_EPISODE = 100 # エピソード数
EPSILON = .1 # 探索率
ALPHA = .1 # 学習率
GAMMA = .90 # 割引率
ACTIONS = np.arange(4) # 行動の集合
実行結果

→ 4×4のシンプルな迷路であるため、20回目ほどでエージェントが最大の報酬を獲得できるようになっている。
※試行回数をエピソードと呼ぶ。
――――――――――――――――――――――――
演習②4×5の迷路。(迷路を大きくする。トラップの数も増やす)
――――――――――――――――――――――――
情報:迷路の状態
def __init__(self):
self.filed_type = {
"N": 0, # 通常
"G": 1, # ゴール
"W": 2, # 壁
"T": 3, # トラップ
}
self.map = [[3, 2, 0, 3, 0],
[0, 0, 0, 2, 0],
[0, 0, 2, 0, 1],
[0, 0, 0, 0, 0]]
情報:使用した設定
# 定数
NB_EPISODE = 100 # エピソード数
EPSILON = .6 # 探索率 ※.1で確認した結果が良くなかったため修正。
ALPHA = .1 # 学習率
GAMMA = .90 # 割引率
ACTIONS = np.arange(4) # 行動の集合
実行結果①

→ 50回目くらいで、ようやく最適解を得れるようになった(難しくなった)
実行結果②探索率.1の場合

→ 最適解にたどり着けないまま終了している。
※パラメータ設定の重要性が分かる結果となった。
【関連記事レポート】
以下サイトには、実装演習のみでなく理論も記載されている。
→ 強化学習エージェントにて行動選択に使用される関数の説明も読み込んでおくべき。
・ε-greedy行動選択
ε-greedy法とは~制御工学の基礎あれこれ~
→上記サイトが分かりやすかった。まずはランダムに選んで、
結果を確認してから最適解を探していく・・というまさに貪欲法の手法。
・softmax行動選択
→ 高期待値の選択肢を選ぶ確率を上げていく手法。
Section2:AlphaGo
【要点】
AlphaGo:
教師有り学習と強化学習を使用して、3つのネットワークを学習させている。
※AlphaGo(Lee)は囲碁だが、後継のAlphaGoZeroは将棋やチェスも可能とのこと。
Alpha Go の学習ステップ:
①PolicyNetの教師あり学習
教師データ:3000万局面分の棋譜データ。教師と同じ手を指せるように学習。
※教師1、その他0とした19×19の配列を分類問題として学習させたとのこと。
②PolicyNetの強化学習
PolicyNetとPolicyPool(500イテレーション単位で強化学習の結果を保管した物)で対局を行い、その結果を用いた方策勾配法で学習。
※ミニバッチ学習(単位:128)を1万回実施したとのこと。
③ValueNetの学習
PolicyNetで対局を行い、途中まで①のモデル、途中から②のモデルを使用。
その勝敗結果をラベルとした教師データを作成して学習。
※ミニバッチ学習(単位:32)を5000万回実施したとのこと。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。
※PythonでAlphaZeroを実装する場合のサンプル・・探すのに時間を要した。
囲碁の盤面(19×19)でなく、Connect4(6×7)の実装。※Connect4:4目並べ
(Google翻訳アドオンで日本語に訳している。今回はgoogle colaboratoryを使用。pipの対象バージョンを若干変えないと動かない・・)

実行結果(ニューラルネットワークの学習状態を確認)

【関連記事レポート】
AlphaGoの作成元であるdeepmindのページを読み込んだ。
・NNの内「ポリシーネットワーク」は、次に再生する動きを選択する。
もう1つのNNである「バリューネットワーク」は、ゲームの勝者を予測する。
→ 概要であるが、各NNの役割が記載されている。
・AlphaZero:チェス、将棋、囲碁のゲームをマスターする方法をゼロから学ぶ、かつ世界チャンピオンのコンピュータープログラムを打ち負かす、単一のシステム。
→ 要点、にも記載している内容。AlphaZeroは「Go」でない→ 囲碁以外でも利用できる。
・MuZeroとして知られる最新バージョンのアルゴリズムは、AlphaZeroのパフォーマンスに匹敵すると同時に、
ゲームのルールの説明なく、視覚的に複雑なゲームに対応する。
→ まだ開発初期の段階とのことであるが、より複雑なゲームにも対応できるモデル「MuZero」が開発中とのこと。
Section3:軽量化・高速化技術
【要点】
高速化:
分散深層学習:並列で学習を行うことで学習の時間を短縮する。
軽量化:
寄与度の低いパラメータの削除、パラメータの精度の削減などで精度を維持しつつ、メモリの使用量などを削減する。
――高速化1:並列化――
①データ並列化:
ワーカー(学習に使用する端末)にモデルをコピー。
データを分割して、各ワーカーで並列に学習を行う。
同期型:
全てのワーカーから結果が返ってくるまで待つ。
結果が帰ってから、平均の勾配を計算してマスターとなるモデル(親モデル)を更新。その後、各ワーカーが最新のマスターを使用して学習を行う。
非同期型:
各ワーカーから結果が返ってき次第、マスターに勾配を反映。
各ワーカーは、順次最新のマスターを使用して学習を行う。
→ 同期型は遅いが精度が高い。非同期型は早いが精度が安定しない。
現在は同期型が主流とのこと。
②モデル並列化
親モデルを分割して各ワーカーにコピー。(中間層を分割するイメージ)
各ワーカーで並列に全てのデータを学習する。
→データが多い場合がデータ並列化。
モデルが大きいときはモデル並列化。を使用するべき。
――高速化2:GPU――
GPU:元々は画像描画のための演算器。CPUより個々の性能が低いが並列処理は強い。
→ 並列化との相性が非常に良い。
――軽量化1:量子化――
パラメータの精度を落とす。(例:64bit浮動小数点 → 32bit)
NNはパラメータ数が膨大であるため、単純に半分にするだけでも効果が大きい。
なおかつ、64bit浮動小数点 → 32bit程度では精度が落ちない。
※落としすぎると極端に精度が落ちる。適切な調整が必要。
――軽量化2:蒸留――
高精度のモデルを基に、新たな軽量のモデルを作成する。
※高精度のモデルを教師に使用するイメージ。高精度のモデルの予測 と 新たなモデルの結果 の差異を利用して、新たなモデルの重みを更新する。
――軽量化3:プルーニング――
刈り込み、という意味。一定より重みが低い(= 寄与度の低い)パラメータを消してしまう方法。
※かなり大胆な削除も可能で、全体の90%近くのパラメータを削除 → 精度は90%以上を維持できる、という例もある。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。
※テーマは色々あるが、今回は「量子化」の確認を行った。
量子化(64bit → 16bit)の効果を確認する。

実行結果
INFO:tensorflow:Assets written to: /tmp/tmpqrhrrf6i/assets
INFO:tensorflow:Assets written to: /tmp/tmpqrhrrf6i/assets
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
Float model in Mb: 0.08052444458007812 ← 量子化前。
Quantized model in Mb: 0.02333831787109375 ← 量子化後。(サイズが1/4となっている)
【関連記事レポート】
――注目した部分――
重要度に基づいて重みのプルーニングを行い、トレーニング プロセスの過程でモデル内の複数の重みを徐々にゼロに指定することで、モデルのスパース性を実現します。スパースモデルは圧縮しやすく、ゼロの部分については推論の際にスキップできるため、レイテンシを改善できます。
この手法では、モデルの圧縮により改善が行われます。将来的には、フレームワークでこの手法をサポートすることで、レイテンシを改善する予定です。モデル圧縮により、精度の低下を最小限に抑えながら、最大で 6 倍の改善が確認されました。
→ 高速化、軽量化、には様々な手法が存在するが、将来的には特に実装を意識しなくても、手法を利用できるようになると思われる。※少なくとも、プルーニングについては将来的にTensorFlowでフレームワーク化されるとのこと。
Section4:応用モデル
【要点】
以下の3つのモデルについて記載する。
・MobileNet
・DenseNet
・WaveNet
――MobileNet――
軽量化・高速化・高精度化を実現した画像認識のモデル。
スマートフォンなどで利用できる軽さが強み。(名前の由来?)
→深さ別の畳み込み、と点別の畳み込み、の組み合わせで軽量化している。
・深さ別の畳み込みのイメージ(1チャネル1フィルタ)
※資料が分かりずらかったので、処理数の削減が分かるように紫の線と囲みを追加。

・点別の畳み込みのイメージ
※資料が分かりずらかったので、処理数の削減が分かるように紫の線を追加。

通常の畳み込みの代わりに、上記の2つの畳み込みを使う事でほぼ同じ処理を高速に行っている。(Depthwise Separable Convolution)
以下の図が分かりやすい。

――DenseNet――
NNでは中間層が増えるほど、前の層の学習が難しくなる。(=勾配消失問題)
その対策を行ったモデルがDenseNet。
以下の様に、後半の中間層の入力に、前半の入力層の出力を使用している。
→ 逆伝搬の際、後半の中間層からダイレクトに前半の入力層に繋がる道がある。
→ 経由する層を抑えつつ、先頭の層に逆伝搬を行うことができる。

――WaveNet――
音声波形を作成するモデル。(Waveフォーマットが由来?)
特徴として、時系列データを畳み込むことで、広い範囲のデータを入力に使用している。(= 受容野を増やしている。)結果、時系列を考慮した非常に適切な出力を行うことができている。この畳み込みを「Dilated Convolution」と呼ぶ。

【確認テスト】
――①(あ)に当てはまる単語を選択する――
深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つである。
提案された新しいConvolution 型アーキテクチャは(あ)と呼ばれ、結合確率を効率的に学習できるようになっている。
・Dilated causal convolution
・Depthwise separable convolution
・Pointwise convolution
・Deconvolution
→正解は一番上の「Dilated causal convolution」
――②(い)に当てはまる単語を選択する――
(あ)を用いた際の大きな利点は、単純なConvolution layer と比べて(い)ことである。
・パラメータ数に対する受容野が広い
・受容野あたりのパラメータ数が多い
・学習時に並列計算が行える
・推論時に並列計算が行える
→正解は一番上の「パラメータ数に対する受容野が広い」。
比較的少ないパラメータで、広い範囲の時系列を考慮した出力を行うことができる。
【実装演習】
実装演習が無いため、以下による演習を行った。
※今回はMobileNetを対象にした。
試した点
元々のプログラムは「パンダの画像をパンダと判定する」内容であるが、
動作の確認のため「猫の画像」に変更した。

使用した猫の画像(パンダと同様にWikipediaの画像を使用)
実行結果

――――――――――――――――――――――――
INFO:tensorflow:Restoring parameters from mobilenet_v2_1.0_224.ckpt
Top 1 prediction: 282 tabby, tabby cat 0.6503355
――――――――――――――――――――――――
画像を「tabby cat(トラ猫)」と判定できている。
【関連記事レポート】
MobileNetに関する資料(V2のリリースの記事)
――注目した部分――
MobileNetV2は、レイテンシ、サイズ、精度をトレードオフし、バッテリー消費を低減した低消費電力を実現しており、小規模、低遅延、低電力のモバイルファースト・コンピュータビジョンモデルとして機能させます。
TensorFlow-Slim Image Classification Libraryの一部としてリリースされます。クラウドに送るのではなく、モバイル上でニューラルネットワークを実行する利点としては、セキュリティ、プライバシ、レイテンシが緩和されること、そして、いつでもどこでもアクセスできるユーザーエクスペリエンスの向上が言えます。
→ MobileNetは軽量化・高速化・高精度化を実現した画像認識のモデル。と記載したが、その目的はここ。サーバへデータを投げることなく、スマートフォンなどの端末で機械学習が完結できるのであれば、サーバにデータを送り、処理を依頼する必要が無くなる。結果、通信の遅延やセキュリティの問題を気にする必要が無くなる。極端な話、オフラインでも利用する事ができるようになる。
Section5:Transformer
【要点】
Transformer:
Seq2seqよりも高速かつ高精度な翻訳に利用できるモデル。
Attentionを利用するのみで、RNNを利用しない。
Encoder-Decoder Model。Encoderで入力をencode → encode結果をDecoderでDecoderする。(どちらも6層を持つ)
Attention:
文中の単語の意味を理解する際に、どの単語をキーとすればよいか、という情報。
例:it という単語は単体では解釈できない。前後の単語(human、he、penなど)をキーとする必要がある。
【実装演習】
実装演習が無いため、以下による演習を行った。
Transformerのチュートリアル(提供元:TensorFlowコミュニティ)
実行結果

比較:Google翻訳の結果

→ 比較的簡単な文章であるものの、ポルトガル語を適切に英語に翻訳できている。
【関連記事レポート】
――注目した部分――
Googleは米国時間5月18日、自然言語分野における最新のブレークスルーとして、自然な会話を実現する新たな言語モデル「LaMDA」(Language Model for Dialogue Applications:対話アプリケーション用の言語モデル)について発表した。
最近の「BERT」や「GPT-3」といった言語モデルと同様に、LaMDAは「Transformer」をベースにしている。TransformerはGoogle Researchが生み出したニューラルネットワークアーキテクチャーであり、2017年にオープンソース化されている。
→ Transformerは2017年にオープンソース化してから、2021年、5年後の最新のモデルのベースにも使用されている。そのため、Transformerの動作の基礎を抑えておくことは、とにかく最新のモデルの仕組みを抑える、という方法よりも有益と思われる。
Section6:物体検知・セグメンテーション
【要点】
物体検知:
画像の中から、物体の場所、種類、数を検知する技術。
分類、物体検知、意味領域分割、個体領域分割などに分けることができる。
※それぞれのイメージは、確認テスト①を参照すること。
物体検知のデータセット:
VOC12、ILSVRC17、MS COCO18、OICOD18等、様々なデータセットが存在する。
※データセット:この場合、分類対象の画像や正解(ラベル)をまとめた物。
同じデータセットに対する結果 = モデルの性能を客観的に比較できる。
ただし、実務で使用するモデルを選ぶ際などは、用途に応じたデータセットに対する結果を参考にすること。
例えば、オークションの画像(≒ 中央に1つの物体)を識別するために、
自然の写真(≒ 様々な場所に様々な物体)に対する精度が高いモデルを使用しても、
想定通りの精度は得られない。
評価指標:
評価指標として、実際の結果(True or False) × 分析結果(True or False)の4パターンの
要素が土台となる。以下は必ず覚える必要がある。

クラス分類:
出力は「~が存在する確率※(0~1の範囲)」となる。
そのため、「~が存在すると断言する」閾値が変われば、同じモデルでも結果が変わる。
物体検出:
出力は「何が、どこに、どれくらいの確率※(0~1の範囲)で存在するか」となる。
※厳密には確率ではない・・。
物体検出の場合は、IoUという指標も評価に使用される。
一言で説明すると、「予測と実際の積結合 / 予測と実際の和結合」 の値。これも0~1の範囲となる。
FPS:
物体検知の場合、精度だけでなく速度も問題となる。
例:分析に100ミリ秒等を要するモデルの場合・・
定期的に物体の数を集計したい場合 → 十分な速度。
自動運転で障害物を検知したい場合 → 遅すぎる。
速度の指標として「FPS:Flames per Second」が存在する。
一言で説明すると、「1秒間で何枚の画像を処理できるか」
物体検知のフレームワーク:
大分類すると以下の2つに分類できる。
2段階検出器:
候補領域の検出とクラス推定を別々に行う。高精度だが遅い。
→ まず画像から物体を抜き出し、その後物体を分類、というイメージ。
1段階検出器:
候補領域の検出とクラス推定を同時に行う。精度が安定しないが早い。
→ 画像から物体の抜き出しと分類を同時に行うイメージ。
【確認テスト】
――①それぞれの物体認識タスクにおける出力は何か?――

→分類:
画像に対する単一or複数のラベル。
例:風船、窓、木など。
物体検知:
各物体の範囲を示す四角形
例:各風船を囲む四角形
意味領域分割:
各物体に対するピクセル単位のクラスラベル
例:風船に対する色付け
個体領域分割:
各物体に対するピクセル単位のクラスラベル
例:風船に対する色付け。なおかつ、風船ごとに異なる色を付ける。
(各風船を区別する)
【実装演習】
実装演習が無いため、未実施。
代替として、資料に記載されている確認テストを一通り学習した。
【関連記事レポート】
物体検知のフレームワーク(YOLO)の情報
――注目した部分――
CarND車両検出は、 Udacity自動運転車Nanodegreeプログラムのプロジェクトです。このプロジェクトの目的は、ダッシュカメラのビデオで車両を検出することです。この実装では、バッチ処理なしで21FPSを実現できます。
→ リアルタイム検知の重要性。例えば完全な自動運転の場合、
①物体検知(例:障害物がある)
②適切な処理の選択と実行(例:ブレーキペダルを押す)
③実際に動作が反映される(例:車が減速する) という流れになるが、
「①物体検知」が一番ボトルネックになると思われる。自動運転の完全化には、物体検知の速度の向上が一番重要なのではないだろうか。(もちろん精度も重要)
以上
E資格の勉強⑤深層学習day3
目次
- 本投稿の目的
- Section1:再帰型ニューラルネットワークの概念
- Section2:LSTM
- Section3:GRU
- Section4:双方向RNN
- Section5:seq2seq
- Section6:Word2vec
- Section7:Attention Mechanism
本投稿の目的
深層学習(day3)に関する学習のまとめ
Section1:再帰型ニューラルネットワークの概念
【要点】
時系列データに対応可能なニューラルネットワーク。
時系列データ=データに前後関係がある。例えばボードゲーム。
今の盤面は「直前(一手前)の盤面」の延長。さらに「直前(一手前)の盤面」は「直前(二手前)の盤面」の延長・・。
この時系列を考慮するために、3つの重みを使用する。
①入力→中間層の重み。
②入力→出力層の重み。
③ひとつ前の中間層→中間層の重み。(ここがRNNの特徴)
この3つの重みを時系列データの開始時点→終了時点まで再帰的に処理する。
※技術者的には「recursive neural network = RNN」と覚えるとよさげ。
BPTT:
時間をさかのぼる誤差逆伝搬。
といっても特殊な事ではなく、微分の連鎖率を使用して、
「最後の時間の誤差」→「最後-1の時間の誤差」・・→「最初の時間の誤差」
を何度も求めることなく少ない計算で求めること。
【確認テスト】
RNNのネットワークには大きくわけて3つの重みがある。
1つは入力から現在の中間層を定義する際にかけられる重み、
1つは中間層から出力を定義する際にかけられる重みである。
残り1つの重みについて説明せよ。
(回答)
【要点】に記載した③の部分。ひとつ前の中間層→中間層の重み。
【演習チャレンジ:再帰型ニューラルネットワーク】
以下は再帰型ニューラルネットワークにおいて構文木を入力として再帰的に文全体の表現ベクトルを得るプログラムである。ただし、ニューラルネットワークの重みパラメータはグローバル変数として定義してあるものとし、_activation関数はなんらかの活性化関数であるとする。木構造は再帰的な辞書で定義してあり、rootが最も外側の辞書であると仮定する。(く)にあてはまるのはどれか。
(1)W.dot(left + right)
(2)W.dot(np.concatenate([left, right]))
(3)W.dot(left * right)
(4)W.dot(np.maximum(left, right))
→答え:(2)。木構造のルートの右側と左側の一覧を全て抜き出し、結合したリストを活性化関数に使う。※「+」や「*」をしてしまうと、単語間の前後の繋がりを失ってしまう。
【演習チャレンジ:BPTT】
左の図はBPTTを行うプログラムである。
なお簡単化のため活性化関数は恒等関数であるとする。
また、calculate_dout関数は損失関数を出力に関して偏微分した値を返す関数であるとする。(お)にあてはまるのはどれか。
(1)delta_t.dot(W)
(2)delta_t.dot(U)
(3)delta_t.dot(V)
(4)delta_t* V
→答え:(2)。過去にさかのぼるたびにUを掛ける必要がある。
【実装演習】
サンプルプログラムの実行結果。
①サンプルプログラムをそのまま実行。(中間層の活性化関数=シグモイド関数)
iters:0
Loss:1.4592344781314095
Pred:[1 1 1 1 1 1 1 1]
True:[0 1 1 0 1 1 1 0]
59 + 51 = 255
------------
iters:100
Loss:1.0581959125913671
Pred:[0 1 1 0 0 0 0 0]
True:[1 0 1 0 0 0 1 1]
47 + 116 = 96
------------
iters:200
Loss:0.8673602168782221
Pred:[0 1 1 0 0 0 1 0]
True:[0 1 0 0 0 0 1 1]
12 + 55 = 98
------------
・
・
・
------------
iters:9800
Loss:0.0012348486845701505
Pred:[1 1 0 0 0 1 0 1]
True:[1 1 0 0 0 1 0 1]
116 + 81 = 197
------------
iters:9900
Loss:0.0011690369308675372
Pred:[1 0 1 0 0 0 0 1]
True:[1 0 1 0 0 0 0 1]
120 + 41 = 161
→最終的に、誤差が0.001近くまで減少している。そして予測[Pred]と答え「True」が全て一致している(=正しく学習できている)。
②中間層の活性化関数をシグモイド関数 → ReLuに変更してみた。
iters:0
Loss:1.877133925079352
Pred:[0 0 0 0 0 0 0 0]
True:[1 0 0 1 0 0 1 1]
83 + 64 = 0
------------
iters:100
Loss:1.4036311687506768
Pred:[1 1 0 1 1 0 0 0]
True:[1 0 0 1 0 0 0 0]
104 + 40 = 216
------------
iters:200
Loss:1.0
Pred:[1 1 1 1 1 1 1 1]
True:[0 1 1 1 1 0 1 1]
6 + 117 = 255
------------
・
・
・
------------
iters:9800
Loss:2.0
Pred:[1 1 1 1 1 1 0 1]
True:[1 0 1 0 1 0 1 1]
117 + 54 = 253
------------
iters:9900
Loss:2.25
Pred:[1 1 1 1 1 1 0 0]
True:[0 1 1 0 0 0 0 0]
92 + 4 = 252
------------
→誤差が減っていない。最終的な精度も良くない。
(=勾配の消失か発散が発生している?)
誤差の推移を見た結果、大きな上下を繰り返している。
勾配の消失?おそらく違う。消失なら、誤差が概ね一定になるはず。
勾配が発散?おそらく当たっている。勾配爆発が発生していると考えられる。
(誤差の推移)
――――――――――――――――――――――――――

――――――――――――――――――――――――――
Section2:LSTM
【要点】
RNNの課題:
時系列が多い → 中間層が多い、という状態と同じ。
→時系列が長いほど、初めの部分が出力層から遠くなる。
→勾配消失問題が発生する。
→活性化関数の変更や正則化などの対応と異なり、構造自体の変更で対応したものがLSTM。
LSTM:
以下の部品を使用する。
・CEC:勾配を1とした自己ループを行うゲート(勾配が1なら勾配は消失も発散もしない)
・入力ゲート、出力ゲート:CECの欠点(学習が行えない)に対応するため、設けられた層。
・忘却ゲート:CECが保持している情報の内、不要となった情報を削除するための層。
【確認テスト:RNNの課題】
その値として正しいものを選択肢から選べ。
(1)0.15
(2)0.25
(3)0.35
(4)0.45
→答え:(2)。最大でも0.25なので、例えば3回さかのぼる場合、勾配は最大でも0.25^2≒0.0015まで小さくなる。
中間層(RNNの場合時系列)が多いほど勾配が消えることが分かる。
【確認テスト:LSTM】
以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。
文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと
考えられる。このような場合、どのゲートが作用すると考えられるか。
「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」
→答え:忘却ゲート。
【演習チャレンジ:RNNの課題】
RNNや深いモデルでは勾配の消失または爆発が起こる傾向がある。
勾配爆発を防ぐために勾配のクリッピングを行うという手法がある。
具体的には勾配のノルムがしきい値を超えたら、勾配のノルムをしきい値に正規化するというものである。
以下は勾配のクリッピングを行う関数である。(さ)にあてはまるのはどれか。
(1)gradient * rate
(2)gradient / norm
(3)gradient / threshold
(4)np.maximum(gradient, threshold)
→答え:(1)。値が大きすぎる(ノルムを超える)場合、正規化されるという内容から推測できる。
【演習チャレンジ:LSTM】
以下のプログラムはLSTMの順伝播を行うプログラムである。
ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。
(け)にあてはまるのはどれか。
(1)output_gate* a + forget_gate* c
(2)forget_gate* a + output_gate* c
(3)input_gate* a + forget_gate* c
(4)forget_gate* a + input_gate* c
→答え:(3)。
Section3:GRU
【要点】
LSTMの課題:
パラメータ数が多く、計算の負荷が高い。この課題に対応するための構造がGRU。
GRU:
ゲート付き回帰ユニット。リセットゲート、更新ゲートと呼ばれる2つのゲートを持つ。(LSTMより1つゲートが少ない)
LSTMと同等以上の精度、かつパラメータ(重み)の数を減らした構造。
【確認テスト:LSTMの課題】
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
→答え:
LSTM:パラメータ数が多く、計算の負荷が高い。
CEC:学習ができない。(結果、入力、出力ゲートが必要になる)
【確認テスト:GRU】
LSTMとGRUの違いを簡潔に述べよ。
→答え:ゲート数が異なる。(LSTM:3ゲート、GRU:2ゲート)
また、GRUの方が軽量である。
【演習チャレンジ】
GRU(Gated Recurrent Unit)もLSTMと同様にRNNの一種であり、
単純なRNNにおいて問題となる勾配消失問題を解決し、長期的な依存関係を学習することができる。
LSTMに比べ変数の数やゲートの数が少なく、より単純なモデルであるが、
タスクによってはLSTMより良い性能を発揮する。以下のプログラムはGRUの順伝播を行うプログラムである。
ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。
(こ)にあてはまるのはどれか。
(1)z * h_bar
(2)(1-z) * h_bar
(3)z * h * h_bar
(4)(1-z) * h + z * h_bar
→答え:4。新しい中間状態は、1ステップ前の中間表現と計算された中間表現の線形和で表現される。つまり更新ゲートzを用いて、(1-z) * h + z * h_barと書ける。
Section4:双方向RNN
【要点】
双方向RNN:
双方向、つまり過去だけでなく未来の情報も考慮することで精度を向上させるモデル。文章の翻訳などに使用される。(文章の場合で説明すると、翻訳に「直前の文脈」だけでなく、「直後の文脈」も使用しよう、というモデル)
【演習チャレンジ】
以下は双方向RNNの順伝播を行うプログラムである。
順方向については、入力から中間層への重みW_f, 一ステップ前の中間層出力から中間層への重みをU_f、逆方向に関しては同様にパラメータW_b, U_bを持ち、両者の中間層表現を合わせた特徴から出力層への重みはVである。
_rnn関数はRNNの順伝播を表し中間層の系列を返す関数であるとする。
(か)にあてはまるのはどれか
(1)h_f + h_b[::-1]
(2)h_f * h_b[::-1]
(3)np.concatenate([h_f, h_b[::-1]], axis=0)
(4)np.concatenate([h_f, h_b[::-1]], axis=1)
→答え:4。まず、「+」や「*」では前後の特徴が混ざってしまう。=concatenateを使用するべき。次に、「h_f(過去→未来)」のデータと「h_b[-1](未来→過去の反転)」のデータを結合するため、axis=1とする。これにより、例えば1,2,3というデータの場合、以下のような行列を作成できる。
[1(過去→未来方向)、1(未来→過去方向)],
[2(過去→未来方向)、2(未来→過去方向)],
[3(過去→未来方向)、3(未来→過去方向)]
【参考】
引数(axis)のイメージ:
Section5:seq2seq
【要点】
seq2seq:
Encoder-Decoderモデルの一種。以下2つの深層学習モデルで構成される。
・入力を中間表現(圧縮したベクトル)に変換(encode)するモデル(Encoder-RNN)。
・中間表現(圧縮したベクトル)を変換(decode) して出力を作成するモデル(Decoder-RNN)。
Encoder-RNN:
入力(例えば、テキストデータ)を、単語等のトークンに区切って渡す。
Taking:文章を単語等のトークン毎に分割し、トークンごとのIDに分割する。
Embedding:上記のIDから、そのトークンを表す分散表現ベクトルに変換する。
Decoder-RNN:
Encoder-RNNの個々の出力を受け取り、出力するデータを生成する。
seq2seqの課題:
最終の入力に対する一問一答しかできない。それまでの文脈などが考慮できない。
→HRED、VHRED、VAE等の会話モデルがある。
HRED:
過去n-1の入力から次の出力を生成できる。
→最終の入力が「はい」や「いいえ」でも、直前の入力から適切な出力が行える可能性がある。(seq2seqより人間らしいやり取りができる)
→課題。同じ流れの会話には同じ回答しかできない。短い回答(Yes、No)などを選びがち。
VHRED:
HREDに、VAEの潜在変数の概念を追加して、HREDの課題に対応したもの。
VAE:
Variational Autoencoder(変動オートエンコーダー) 。
データを潜在変数zの確率分布という構造に押し込めることができる。
(以下のリンクを読むと分かる)
【確認テスト:seq2seq】
下記の選択肢から、seq2seqについて説明しているものを選べ。
(1)時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
(2)RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
(3)構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作るという演算を再帰的に行い(重みは共通)、文全体の表現ベクトルを得るニューラルネットワークである。
(4)RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。
→答え:2。(1は双方向RNN。3は純粋なRNN。4はLSTM)
【確認テスト:VHRED】
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
→答え:
seq2seqとHRED:seq2seqは一問一答。HREDは直前の入力を使用した出力が可能。
HREDとVHRED:HREDは短い回答が多い。また、同じ流れの場合同じ回答。VHREDはVAEにてHREDの課題に対応する。
【演習チャレンジ:seq2seq】
演習チャレンジ機械翻訳タスクにおいて、入力は複数の単語から成る文(文章)であり、それぞれの単語はone-hotベクトルで表現されている。
Encoderにおいて、それらの単語は単語埋め込みにより特徴量に変換され、そこからRNNによって(一般にはLSTMを使うことが多い)時系列の情報をもつ特徴へとエンコードされる。
以下は、入力である文(文章)を時系列の情報をもつ特徴量へとエンコードする関数である。ただし_activation関数はなんらかの活性化関数を表すとする。
(き)にあてはまるのはどれか。
(1)E.dot(w)
(2)E.T.dot(w)
(3)w.dot(E.T)
(4)E * w
→答え:1。Eは単語の埋め込みの一覧表(word embedding matrix)。単語ごとの特徴ベクトルが書かれた表のイメージ。この特徴ベクトルと重みを掛けた値を返せばよい。
【確認テスト:VAE】
VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。
自己符号化器の潜在変数に____を導入したもの。
→答え:確率分布z∼N(0,1)
Section6:Word2vec
【要点】
word2vec:
文字は人間が作成した単なる記号であり、金額や色(RGBA)、物のサイズのような大小関係や連続性が無い = 文字のままではNNに使用できない。
各単語をone-hotベクトル※に変換する必要がある。が、世界中の全単語をone-hotベクトルする事は物理的に不可能、かつ、one-hotベクトルでは単語の類似度などを把握できない。
※one-hot ベクトル:1つの成分が1、残りの成分は全て0のベクトル。
word2vecは「単語の確率分布は、周辺の単語によって決定される」という分布の仮説に基づいて、単語をone-hotベクトルでないベクトルに変換する方法。
Section7:Attention Mechanism
【要点】
Attention Mechanism:
sec2secは中間表現(圧縮したベクトル)を使用して出力を作成する。
→中間表現(圧縮したベクトル)はサイズが決まっているので、入力が短い文章でも、長い文章でも使用できるベクトルの次元数は同じ。
→長文に弱い。(表現を持ちきれない)
→中間表現(圧縮したベクトル)を使用して出力を作成するタイミングで、元々の入力を参照できるようにする方法。
【確認テスト】
RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
→答え:
RNNは時系列データに対応可能なニューラルネットワーク。処理対象だけでなく、処理対象の前のデータ(中間層の出力)も用いて、処理に使用する。
※直前~現在の流れを考慮した処理を行える。
word2vecは文章(単なる人が作成した記号であり、NNで利用するにはベクトルに直す必要がある)をone-hot-ベクトルでなく、単語ごとの関連性を持たせたベクトルに変換する手法。
seq2seq:Encoder-Decoderモデルの一種。2つのNNを持ち、文字に対する一問一答が可能である。
Attention:seq2seqの課題(長文に弱い)に対応するために、seq2seqのDecoderへの入力として、「Encoderの成果物」に加えて、「入力」も使用して、入力データに柔軟なを可能とする
E資格の勉強④深層学習day2
目次
- 本投稿の目的
- Section1:勾配消失問題
- Section2:学習率最適化手法
- Section3:過学習
- Section4:畳み込みニューラルネットワーク(CNN)の概念
- Section5:最新のCNN
本投稿の目的
深層学習(day2)に関する学習のまとめ
Section1:勾配消失問題
勾配消失問題
【要点】
勾配消失問題:
誤差伝搬法では、パラメータの更新量は「出力層 → 入力層」方向に計算していく。
しかし、パラメータの更新量 = 傾きが0になる値を微分で求めるが、
活性化関数に「シグモイド関数」を使用している場合、入力値が大きいと傾きがほぼ0になり更新量が消えてしまう。
結果、階層(入力層に近い層)のパラメータが一切更新されなくなり、学習が止まってしまう。
これが勾配消失問題。
【考察結果】
確認テスト1:シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。
(1)0.15
(2)0.25
(3)0.35
(4)0.45
(回答)
(2)0.25
(補足)
シグモイド関数:f(x) = [1 / (1 + exp^x)]
シグモイド関数の微分:f'(x) = f(x)(1−f(x))
→ これにx=0を代入すると、0.5× (1-0.5) = 0.25
数値の0乗 = 1になるため、簡単に計算できた。
※最大でも0.25と小さい。
仮に、入力値が「5」の場合、微分結果は「0.00664・・」まで小さくなる。
→ パラメータの更新量がほぼ0となってしまう。
勾配消失問題の解決法
【要点】
複数の解決方法が存在する。
①活性化関数の選択:
ReLu関数を使用する。
入力が0以下 :0
入力が0を超える:入力
→ 微分結果が大きくなるので、勾配消失を防止できる。
②重み(W)の初期値設定
Xavier(ザビエル)を使用する。
→ 重みの要素を、前層のノード数の平方根で割った値
③バッチ正規化
ミニバッチ単位で、データを正規化(最大1、最小0)する。
【考察結果】
確認テスト1:重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
(回答)
重みの初期値に0を設定(正しく表現すると、重みに同じ値を設定する)と
順準伝搬の結果が同一となる
→ 逆伝搬法による更新量も同一となる
→ 全く同じ動作をするノードが複数存在することになる。
(ノードを多数持つ意味が無くなってしまう)
確認テスト2:一般的に考えられるバッチ正規化の効果を2点挙げよ。
(回答)
①ミニバッチごとに発生する入力データの差を抑制できる。
→ミニバッチごとの学習のブレを(過剰や過少な学習)を防止できる。
→学習の速度と精度の向上を期待できる。
②入力の分布によっては、勾配消失が発生する可能性がある。
→入力データを適切な範囲に変換することで、適切な更新量を維持できる。
→勾配消失問題の抑制。
(参考)
https://www.renom.jp/ja/notebooks/tutorial/basic_algorithm/batch_normalization/notebook.html
→考察:バッチ正規化の目的 = バッチごとにバラつく可能性がある入力を安定させて、学習も安定させてしまおう、という考え。
Section2:学習率最適化手法
【要点】
学習率:
更新量を反映させる際の割合。適切な値を設定する必要がある。
学習率が大きすぎる場合:
→ 最適解にたどり着かない。
※ふり幅が大きすぎる振り子のイメージ。
学習率が小さすぎる場合:
→ 最適解にたどり着つまでに時間を要する。局所最適解から動けなくなる。
※ふり幅が小さすぎる振り子のイメージ。
→ 基本的な方針として、学習率を動的にして、
初めは大きく、学習が進むにつれて小さくする。
学習率最適化手法:
学習率を調整する方法。
・モメンタム(慣性):勾配降下法の調整に加えて、以下を加算する。
→ 絶対値[現在 - 前回の重さ] × 慣性(前回動いた分の慣性が働くイメージ)
・AdaGrad
・RMSProp
・★Adam★ ←最も主流の手法。モメンタムとRMSPropの長所を持っている。
【考察結果】
確認テスト1:モメンタム・AdaGrad・RMSPropの特徴をそれぞれ簡潔に説明せよ。
(回答)
・モメンタム:
学習率が一定。最適解に近づく時間が早い。大域的最適解に移動できる。
・AdaGrad:
学習率が可変。モメンタムより事前設定必要なハイパーパラメータが少ないため、設定が容易。
(モメンタム=学習率と慣性。AdaGrad=学習率のみ)
学習が進むほど学習率が低下する。鞍点問題※の問題がある。
※馬の鞍のように、なだらかな地点(精度が上がる点が遠くにある)場合、
学習を行えなくなる問題。(学習量が小さい → 精度が上がる点までたどり着けない → 学習できない)
・RMSProp:
学習率が可変。AdaGradを改善した物。
【演習】
①SGD
(実行結果)

→ 学習データ、検証データ共に精度が上がらない。
(実行結果※バッチ正規化あり)

→ ある程度改善した。60%の割合で正解できる。
②momentum
(実行結果)

→ 学習データ、検証データ共に精度が上がらない。
(実行結果※バッチ正規化あり)

→ 大きく改善した。(90%近い精度)
③AdaGrad(momentumのアルゴリズムを基に作成してみた)
(作成したアルゴリズム)
for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
# ===========================================
# momentum
# ===========================================
# if i == 0:
# h[key] = np.zeros_like(network.params[key])
# h[key] = momentum * h[key] - learning_rate * grad[key]
# network.params[key] += h[key]
# ===========================================
# AdaGrad
# ===========================================
if i == 0:
h[key] = np.full_like(network.params[key], 1e-4)
else:
h[key] += np.square(grad[key])
network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]))
(実行結果)

→ 学習データ、検証データ共に精度が上がらない。
(実行結果※バッチ正規化あり)

→ 大きく改善した。(80%の精度)
④RMSProp
(実行結果)

→ バッチ正規化なしでも、非常に高い精度。
⑤Adam
(実行結果)

→ バッチ正規化なしでも、非常に高い精度。
Section3:過学習
【要点】
過学習については、機械学習で学習済み。(忘れている場合、機械学習のレポートを参照する)
ここでは、「正則化 = 過学習を防止する方法」について、記載する。
・L1正則化、L2正則化:
誤差関数に各ノルムを加えて重みを抑える方法。ノルムは以下が参考になる。
※L1ノルム:ダイヤ型(マンハッタン距離)、L2ノルム:円(ユークリッド距離)と認識しておく。
manabitimes.jp
・ドロップアウト:
ノードをランダムに削除して学習させる。
※一般的には隠れ層(中間層)の場合は50%ほどのノードを無効化するとよい、とのこと。
【考察結果】
確認テスト1:線形モデルの正則化の手法の中にリッジ回帰という手法があり、その特徴として正しい物を選択しなさい。
(a)ハイパーパラメータを大きな値に設定すると、全ての重みが限りなく0に近づく。
(b)ハイパーパラメータを0に設定すると、非線形回帰となる。
(c)バイアス項についても、正則化される。
(d)リッジ回帰の場合、隠れ層に対して正則加工を加える。
(回答)
(a)ハイパーパラメータを大きな値に設定すると、全ての重みが限りなく0に近づく。
(考察)
リッジ回帰(L2ノルム)のハイパーパラメータを大きくする → 罰則が大きい → 重みが小さくなる。
確認テスト2:下図について、L1正則化を表しているグラフはどちらかを答えよ。

(回答)
L1ノルム = マンハッタン距離なのでダイヤ型。答えは右の図。
【演習】
①過学習が発生しているデータ。
→ 練習用データの精度は高いが、テスト用データの判定率が低い。

②L2正則化

③L1正則化

パターン1:ドロップアウト割合=15%
→比較的、適切に学習できるようになっているが、最終的に精度が乖離(≒過学習)となっている。

パターン2:ドロップアウト割合=50%
→全く学習が進んでいない。(ドロップアウトしすぎている)

パターン1:ドロップアウト割合=8% かつ 正則化強度=0.004
→L2正則化に近い形となっている。

パターン2:ドロップアウト割合=12% かつ 正則化強度=0.006 (パターン1の1.5倍)
→精度を上げ切れていない。正則化が強すぎると思われる。

Section4:畳み込みニューラルネットワーク(CNN)の概念
【要点】
CNN:画像や動画認識で広く使われるモデル。以下のような構造を持つ。
・入力層→畳み込み層→プーリング層→全結合層→出力層
※学習のターゲットとして、LeNetを題材としている。
【各層の説明】
畳み込み層:
3次元の空間画像も学習できるような層。
出力 = 活性化関数(入力 * フィルター(≒重み) + バイアス)
★用語★
バイアス:
バイアス項と同じ。
パディング:
入力(中途半端なサイズ)を処理しやすいサイズに調整する。(埋める)
調整分は0埋めか、周囲と同じ値などを設定する。
フィルターの移動量。
チャンネル:
入力を判定するフィルターの数の様な物。異なる複数のフィルターを使用して、
識別性能を向上させる。
プーリング層:
入力(=畳み込み層の出力)から、特定の値を取得する。(最大値や平均値)
単語の意味を把握すると覚えやすい。
※プーリング:統計学には「グループをたばねる」という意味。
【考察結果】
確認テスト1:サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なお、ストライドとパディングは1とする。
(回答)
5×5
(イメージ)
以下の★部分が縦横1マスずつ動くイメージ。
――――――
★★〇〇〇〇
★★〇〇〇〇
〇〇〇〇〇〇
〇〇〇〇〇〇
〇〇〇〇〇〇
〇〇〇〇〇〇
――――――
【演習】
★畳み込み層★
・畳み込み層の実装
'''
input_data: 入力値
filter_h: フィルターの高さ
filter_w: フィルターの横幅
stride: ストライド
pad: パディング
'''
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
# N: number, C: channel, H: height, W: width
N, C, H, W = input_data.shape
out_h = (H + 2 * pad - filter_h)//stride + 1
out_w = (W + 2 * pad - filter_w)//stride + 1
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))
for y in range(filter_h):
y_max = y + stride * out_h
for x in range(filter_w):
x_max = x + stride * out_w
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
col = col.transpose(0, 4, 5, 1, 2, 3) # (N, C, filter_h, filter_w, out_h, out_w) -> (N, filter_w, out_h, out_w, C, filter_h)
col = col.reshape(N * out_h * out_w, -1)
return col
・畳み込み層の使用
input_data = np.random.rand(2, 1, 4, 4)*100//1 # number, channel, height, widthを表す
print('========== input_data ===========\n', input_data)
filter_h = 3
filter_w = 3
stride = 1
pad = 0
col = im2col(input_data, filter_h=filter_h, filter_w=filter_w, stride=stride, pad=pad)
print('============= col ==============\n', col)
・出力
========== input_data ===========
[[[[77. 89. 22. 24.]
[51. 27. 81. 89.]
[87. 71. 64. 12.]
[12. 34. 17. 85.]]]
[[[20. 92. 53. 41.]
[66. 54. 6. 29.]
[ 3. 59. 64. 23.]
[18. 82. 92. 37.]]]]
============= col ==============
[[77. 89. 22. 51. 27. 81. 87. 71. 64.]
[89. 22. 24. 27. 81. 89. 71. 64. 12.]
[51. 27. 81. 87. 71. 64. 12. 34. 17.]
[27. 81. 89. 71. 64. 12. 34. 17. 85.]
[20. 92. 53. 66. 54. 6. 3. 59. 64.]
[92. 53. 41. 54. 6. 29. 59. 64. 23.]
[66. 54. 6. 3. 59. 64. 18. 82. 92.]
[54. 6. 29. 59. 64. 23. 82. 92. 37.]]
→入力 ※イメージ:4×4ピクセルの画像2枚の、赤の強さ(RGBのR)
→出力 ※イメージ:3×3のフィルタで入力を抜き出した結果。
★プーリング層★
・プーリング層の実装
def forward(self, x):
# FN: filter_number, C: channel, FH: filter_height, FW: filter_width
FN, C, FH, FW = self.W.shape
N, C, H, W = x.shape
# 出力値のheight, width
out_h = 1 + int((H + 2 * self.pad - FH) / self.stride)
out_w = 1 + int((W + 2 * self.pad - FW) / self.stride)
# xを行列に変換
col = im2col(x, FH, FW, self.stride, self.pad)
# フィルターをxに合わせた行列に変換
col_W = self.W.reshape(FN, -1).T
out = np.dot(col, col_W) + self.b
# 計算のために変えた形式を戻す
out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
self.x = x
self.col = col
self.col_W = col_W
return out
★CNN全体★
※PCの性能が低いのでデータを大幅に削減する。
# 処理に時間のかかる場合はデータを削減
x_train, d_train = x_train[:50], d_train[:50]
# x_train, d_train = x_train[:5000], d_train[:5000]
x_test, d_test = x_test[:10], d_test[:10]
x_test, d_test = x_test[:1000], d_test[:1000]
Section5:最新のCNN
【要点】
AlexNet:
2012年の画像認識コンテストで優勝したモデル。
サイズ4096の全結合層の出力にドロップアウトを使用して、過学習を防止している。ja.wikipedia.org
【考察】
GPUを用いて高速な学習を実現している。とのこと。
→このあたりになると、単なる個人PCでは難しいと思われる。
※本Sectionのみ、確認テスト、実装なし。