月別アーカイブ: 2017年12月

[Unity]:ml-agentsのBasicデモを改良する

[検証バージョン]
Unity 2017.2.0p4
Unity ML – Agents (Beta) 0.2

Unityが提供している機械学習の仕組みに関するお話です。

Unity ML – Agents (Beta)に含まれるBasicデモが、学習させても期待通りの結果が得られなかったので、学習に使用するstateを増やしたところ概ね期待する結果が得られるようになりました。

・デモの内容
エージェントが1マスずつ左右に動き、ゴールに到達したらリワードを獲得。
ゴールは2種類あり、片方は近いがリワードは小さい、もう片方は遠いがリワードは大きい。

・変更内容
Brainが判断をするために与えられている情報(state)がエージェントの左右の位置しか無かったので、各ゴールの位置も渡すように変更。

1.BrainのStateSpaceTypeをDiscrete→Continuousに変更し、StateSizeを元々の1→3に増やす。

2.BasicAgent.cs内のCollectState()にて収集する情報を追加する。

	public override List<float> CollectState()
	{
		List<float> state = new List<float>();
		state.Add(minPosition); // 追加
		state.Add(maxPosition); // 追加
		state.Add(position); // 元々ある行
		return state;
	}

・補足
かなり単純なデモでありながら、8エージェント×10,000ステップの学習でもまだ無駄な動きがあるように見えるので、もっとパラメータや処理の調整が必要なのかもしれません。

・追記-改善案(未検証)
1.位置情報に関するstateはエージェントとの相対座標でコード化した方が良い。
Environment Design Best Practices

2.エージェントのObservationsにカメラを設定することで、視覚情報を与え学習の効率化ができるかもしれない。
Learning Environments Overviewの最後の項Additional FeaturesのComplex Visual Observations

SafariでWebGL内のファイルが保存ができない

・症状
Safari上で実行しているWebGLアプリで設定データなどが保存されず、再訪問もしくは再読み込みの度に設定データが初期状態に戻ってしまう問題が発生しました。

JavaScriptコンソールを見ると、WebGLの初期化時に
“IndexedDB is not available. Data will not persist in cache and PlayerPrefs will not be saved.”
というログが出ていました。

・対応
※ セキュリティ上の問題があるかもしれませんので、ご自身の判断で行ってください。

Safariの「開発」メニューから「クロスオリジンの制限を無効にする」設定をすると設定データを保持できるようになります。

ただ、JavaScriptコンソールに以下の警告ログが出るようになります。
“warning: FS.syncfs operations in flight at once, probably just doing extra work”
[参考]:warning: FS.syncfs operations in flight at once, probably just doing extra work

・原因
WebGLではファイルのIOにindexedDBを使用しています。
これがSafariのデフォルト設定ではセキュリティにより使用できないようになっているようです。
[参考]:
(Appleに開発者登録している方しかご覧になれないかもしれません。)
What’s New in Safari – Safari 11.0 – Security and Privacy

・補足
Unityから書き出したWebGLでファイルIOが上手くいかない問題がもともとあったようです。
[参考]:Data PersistenceSaving Games Online in Unity WebGL

ただUnity2017.2では対応がされているようです。
(実際にはだいぶ前のバージョンで対応されているようです。)
前記の警告ログはUnityのWebGLがindexedDBを同期する時に出ているものと思われます。