simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:別スレッドで重い処理(AI処理とか、画像処理とか)

Unity でビジュアライズしている何かしらのアルゴリズム(AIとか画像処理とか)について、処理中にUIが固まることはユーザービリティの面から看過できません。

Unity 2017 になってから、C# 5.0 からの新機能 Task(async/await) が使えるようになりました。
これを使うだけです。

ただ使うには、PlayerSettingsをExperimental(実験的な設定)に変更する必要があります。私は次の記事を参考に変更しました。
qiita.com

具体的なコードとしては

await Task.Run 以降のラムダ式をメインスレッドとは別のスレッドにて非同期実行させることができます。
await キーワードは async キーワードを付けた関数の中でなければ、記述できません。

ということで、以下のようなコードで重い処理を別スレッドで書き、結果が出たらスレッドアンセーフでゲームオブジェクトへ適用することができるようになります。

using System.Collections;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;

public class ThreadTaskTestBehaviour : MonoBehaviour
{
    void Start()
    {
        this.MoveAsync();
    }

    private async void MoveAsync()
    {
        var context = SynchronizationContext.Current;
        await Task.Run(() =>
        {
            for (int i = 0; i < 10000; i++)
            {
                if (9999 == i)
                {
                    Vector3 position = Vector3.zero;
                    Debug.Log("i = " + i);
                    context.Post((state) =>
                    {
                        position = this.transform.localPosition;
                        Debug.Log("position.x = " + position.x);
                        position.x -= i * 0.01f;
                        this.transform.localPosition = position;
                        Debug.Log("in post position.x = " + position.x);
                    }, null);
                    Debug.Log("out of post position.x = " + position.x);
                }
            }
        });
    }
}

Action を切り離して書くと以下のような感じです

using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;

public class ThreadTaskTestBehaviour : MonoBehaviour
{
    private static SynchronizationContext _context;

    void Start()
    {
        _MoveAsync();
    }

    void Update()
    {
        Debug.Log("Update");
    }

    private async void _MoveAsync()
    {
        _context = SynchronizationContext.Current;
        await Task.Run(_Action);
    }

    private Action _Action = () =>
    {
        const int loopMax = 10000;
        for (int i = 0; i < loopMax; i++)
        {
            Debug.Log("Action i = " + i);
            if (loopMax == i + 1)
            {
                _context.Post((state) =>
                {
                    Debug.Log("in main thread");
                }, null);
            }
        }
        Debug.Log("finish");
    };
}

別に await 付けなくても、Task.Run 以降のラムダ式を別スレッドとして実行できます。
await するからには実行完了を待つわけで、ゆえに async 関数の中でないと宣言できないというわけでした。
併せて読みたいのは引数をスレッドごとに変えて渡す方法です。
simplestar-tech.hatenablog.com

また、次の私の記事でUniRx を勉強していて見つけたのですが
simplestar-tech.hatenablog.com

UniRx を導入すると次のコードで別スレッド処理を実行できました。

Observable.Start(() => {
// ここに別スレッドで行う処理
})
.ObserveOnMainThread()
.Subscribe(_ => { });

しかし、2018年中ごろには、Unityが並列処理を行う C# Jobs System を入れてくるらしいので、いずれはそれを使うことになるかもですね。

www.slideshare.net
しかし、単一の重い処理をバックグラウンドで実行する処理は、ひとまず今回の記事のやり方で対応できます。

以下、参考にした記事
Unityでのマルチスレッド処理はみなさんの関心事なんだなって思います。

techblog.kayac.com
tyheeeee.hateblo.jp
satoshi-maemoto.hatenablog.com
qiita.com
qiita.com

AIに身体性を与えるためのマイクロワールドの構想

およそ9ヶ月前の記事にて、AIが行動するマイクロワールドを作ることを宣言しました。
この記事では、そのマイクロワールドをプロシージャルに、つまり数式や処理を組み合わせて生成する方法について考察し、実践していきます。

その記事というのがこちら↓
simplestar-tech.hatenablog.com

「頑張って言葉にすると、AIが行動するマイクロワールドを作り、それを観察できるオンラインゲームを作ってみたいと考えています。」

大目標は、観察するとまるで自律的に行動する知能がそこにあると錯覚するようなエージェントをマイクロワールド内に登場させることです。
大枠で必要になってくるのは次の三つです。

1.マイクロワールド
2.それを観測して、影響を与えられるアクションが実行できるエージェント機構
3.ワールド・エージェントそれぞれの制御ロジック

素人がAIについて考えると、1.2.の部分の構想をおろそかにして、3.のエージェントの制御ロジックに焦点を当てて議論を始めます。
過去の研究者がそうでした。

AIによって、現実世界の問題を解こうとする研究者もまた多くいます。
その方が、世の中のためになり、お金になる未来があるからですが
しかし、そこには現実世界を100%正しく認識するという、きわめて難しい課題が存在しています。

この課題は、半世紀以上、人類が頭を悩ませ続けても、だれ一人完成させることができませんでした。
断言できるのは、ここで私が努力を続けても、絶対に解決できないということです。

そこで、私は仮想世界の問題を解こうとするエージェントを用意し、仮想世界を100%認識できる機構をあらかじめ用意することで
これまで人類が到達できなかった課題の解決を先送りにして、さらに先にあるエージェントの制御ロジックを考えてみることを思いつきました。

なので、今、世界中の研究者が行っている次の三つの必要項目を

1.現実世界
2.現実を観測して、影響を与えられるアクションが実行できるロボット機構
3.ロボットの制御ロジック

繰り返しになりますが、私は次の三つに置き換えて

1.マイクロワールド
2.それを観測して、影響を与えられるアクションが実行できるエージェント機構
3.ワールド・エージェントそれぞれの制御ロジック

AI研究をするなら仮想世界の構築から行う必要がある、というメッセージを持って、これに従って行動していくことにしました。

では、その仮想世界(マイクロワールド)をどのようにして作っていくのかを考えていきましょう。

マイクロワールドの構造

前提として考えておかなければならないことを次に列挙します。

1.私のやる気と時間が限られたリソースであること(これ、一番大事)
2.コンピュータもメモリとハードディスクと計算量は限られたリソースであること

1.を考慮したとき、マイクロワールドの構造の現実的な回答は、要素シミュレーションによるプロシージャル生成になります。
例えると、宇宙空間にビックバンインパクトを巻き起こして、200億年ほど原子とその相互作用を計算し今のような世界を構築するといった、神が行ったアプローチに似た手法です。(詳細は知らないけど)
つまり、世界の構成要素を一つ一つ手作業で作りこむことはしたくないということです。
2.をここで考慮すると、世界をモデル化して、かなり大きな粒度で相互作用を計算する仕組みが必要になってきます。
例えると、マインクラフトのような1m立方のブロックで構成された世界を、視野に収めたブロックの部分だけが最長16ブロック単位でだけ相互作用する構造です。

あと、Unity で作るというのも私にとって必要なことですね。
まずは、こうした誰でも思いつくようなマイクロワールドの構造を、提供してくれるようなUnityアセットを探してみましょう。

うーん、残念ながら AI 向けに、ブロック情報を取得しつつ、絵を出すようなアセットは見つかりませんね。

多くは、見た目重視のテレインの自動生成ツールばかりです。

www.denispahunov.ru
www.terraincomposer.com

調べ方を変えて、マイクラ風な地形生成で調べてみたところ、パーリンノイズを使った手法が多数ヒットしました。

kan-kikuchi.hatenablog.com

ワールドの初期状態決めについては、こうした地形生成が良さそうですね。
さっそく試してみました。

f:id:simplestar_tech:20170917151653j:plain

なるほど、地下深くまで掘り下げているわけではないですが、かなり描画負荷が高いですね。
マインクラフトは描画を高速化するための、かなり軽量化するアイディアが詰まっているものと思われます。

歴史的に、プロシージャル技術の初期の狙いはメモリ使用量の削減でした。
そこで、これから作るマイクロワールドの設計について、人類がまだ近代科学に至る前の思想を用いて
次のアイディアを盛り込もうと思います。

1.Unity 表示非依存のモデル(データ空間)におけるマイクロワールドの記述
2.格子状のブロックで構成される
2-1.平面充填(へいめんじゅうてん)は三角形(マインクラフトの四角形とは異なる)
2-2.ブロックは三角柱
2-3.ブロックには基底クラスが割り当てられ、面接続された上下2つのブロックと周囲3つのブロックを参照できる
3.ブロックの種類は四元素(火、風(空気)、水、土)があり、五行説(木、火、土、金、水)によって直接作用し合い、日と月の影響を間接的に受けて変化する

雷(電気)は、ひとまず保留します。

ブロック同士の作用を考えながら、基底クラスに必要なものを創り出していきます。

Unity 非依存なので MonoBehaviour は継承することはないです。
Unity ゲーム内にてブロックを表示することになったりすると、様々なコンポーネントを追加するために
MonoBehaviour を継承したブロック操作クラスは必要になりますが
何も、この基底クラスを継承して作ることはなく、単に情報を引き出す形で紐づけるだけで良いはずです。

重要なのは、まだ議論に出てきていない、エージェント・アーキテクチャの部分です。

エージェント・アーキテクチャとの関係

エージェント・アーキテクチャとは、車の運転免許試験の教本の表紙に書かれているような

認知→判断→行動

の仕組みのことです。(終わり)

どうも、この運転教本に載ったあたりまえのフレーズを、高尚な表現としてゲームAIの業界ではエージェント・アーキテクチャって言うらしいですよ。
まぁ、もう少し付け足すと、認知(認識)モジュール、判断(思考)モジュール、行動(アクション)モジュールに分けて、それぞれを短期記憶装置(ブラックボード)とのメッセージのやり取りで実現する、ゲーム内のキャラクターの制御機構といった感じです。

モジュールを分割することによって、集団で開発する際に並列作業が行いやすくなり、変更の影響範囲が限定できることから、デバッグも行いやすくなるという設計となっています。
このエージェント・アーキテクチャに概ね従う形で、作っていくとして、マイクローワールドがどのように、このエージェント・アーキテクチャに関わるのかを考えていきましょう。

認識モジュールでは、マイクロワールドのどの情報が、どのようにアクセスされるのか想像してみましょう。

最も重要なことは、感覚器官に正しい経路で、正しく情報が伝達されることです。
感覚器官は全部で五つ、視覚、聴覚、嗅覚、触覚、味覚です。
中でも、視覚
これが知能にとって最も難しい認識処理となります。

カメラを設置してカメラ画像のようなものを思考モジュールに与える?
確かに現実問題を解くにはこの方法が正しい情報の伝達となります。
gym.openai.com
このように OpenAI でも Minecraft のカメラ画像を入力とするチャレンジがあります。

しかし、残念ながら、画像だけ入力することによる機械の正しい認識は、生涯叶わない夢であると、私は早々にあきらめているので
ここでは、画像ではなく意味を受け取ることにします。
例えば、視界に入った木のブロックが燃えているならば、認識モジュールには、目の前の木が燃えている、という意味が正しく伝わるようにするのです。

エージェントへの情報の伝達経路

さて、ここで視界に入るとは、どのようにして実現されるのでしょうか?
考えてみましょう。

エージェントからレイ(光線)を飛ばして、空気を通って当たった最初の不透明なブロックの情報を引き出して、エージェントにそのブロックに起きている情報を与える
そのほか、視野空間としての円錐の中にあるブロックの情報をすべてを取得し、すべての情報を受け取るなど、方法はいくつか考えられます。
ここで、透明なブロックとは空気やガラスといった材質のブロックのことですね。

重要なのは確実さと、速度ですので、効率的にブロックの隣接するペアをたどっていく形式とします。
少し楽観的ですが、これで方向と距離をたどることで、視界に入る必要な情報すべてを手に入れられるとしましょう。(少なくとも調査対象のブロックは列挙できるものとします。)

次は聴覚についてです。
音が空間を伝わると考えたとき、これも音源から空間をたどって周囲のブロック、場合によっては壁越しに音が伝わるとします。
ここで重要な概念として、音などのメッセージの種類と内容が周囲に伝播する仕組みが必要になることが見えてきます。

このメッセージの種類と内容というのは、そのまま思考モジュールに渡るのではなく、認識モジュールのフィルタリングを経て、ブラックボードに書き込まれ、これを思考モジュールが必要に応じて取り出し、アクションを取るべきか判断します。
さらに重要なことが見えてきました。
それは、ブロック間を伝わるメッセージは認識や思考モジュールが利用するメッセージと同じ形式ということです。

嗅覚も同様、においというメッセージが空間を伝播することにより、周囲の認識モジュールにて拾われることになります。
触覚は触れなければならないので、エージェントの身体とも呼ぶべき「構成物体」が隣接したときに、確かなメッセージとして伝わります。
最後の味覚に関しては、オブジェクト?をくちに入れるなどして、味覚としてエージェントが認識します。
これは、対象をくちに入れる、入れられるというアクションによって起きる現象ですね。
甘味、苦味、酸味、塩味の4つの基本味と、さらにうま味の混合パラメータをオブジェクトからメッセージとして受け取れると良いですね。

ここで、新しい概念が登場しました。
オブジェクトです。
世界を構成している四つの元素ブロックの他に、それらによって作り出されたオブジェクトという情報単位が、物質として世界に存在します。
それらも世界を構成する時は、ブロックの中に配置され、混合物として可視のものとなります。

ブロックは複数のオブジェクトによって構成されていることになりました。
オブジェクトもまた、複数のオブジェクトによって構成されることはあるのでしょうか?
例えば、葉オブジェクトが集まった草オブジェクト、その草オブジェクトが集まった…なんですかね?
た、例えば、石オブジェクトが集まった砂利オブジェクト、その砂利オブジェクトが集まった…なんですかね?
うーん、混合物というものは、すべて同一の粒度のオブジェクトによって構成されているとは限らない、とするなら
良い例は思いつかなくても、オブジェクトは何らかのオブジェクトによって構成されているということで問題ないはずです。
人工物なら、説明がしやすいのですけどね。
カバンの中に財布がある、財布の中にお金がある。
といった具合に、カバンオブジェクトによって構成される、貨物ボックスというオブジェクトも定義できます。
また、それ以上分割できないプリミティブなオブジェクトというものは存在できず、どこまでも構成要素として分割できるとして
それは観測する側の限界分解能において、それ以上分割してメッセージを処理する必要がないものとします。

いつか、バケツに入っているのが水であるならば、そのバケツを倒すと、その水がこぼれることを予想するように
オブジェクトの構成要素にも注意をはら人工知能が作れることを願い、オブジェクトの包含関係を記述することとします。

そろそろ構想してきたものを形にして、実際に動かしながら不備を見つけていきたいと思います。
次回は、マイクロワールドを構築するプログラムを設計、実装していこうと思います。

英語の勉強

今朝は、次を訳してみます。

www.theatlantic.com

タイトル:我々は向かっていた、ユダヤの人々の歴史における重大な分岐点の一つに
保守的なユダヤ教主導者における小さな声集団が、ユダヤ人と非ユダヤ人との結婚を受け入れる動きを後押ししています。
この戦いはまさにユダヤ教の未来に関わっているといえます。

-

6月の終わり 19 日にユダヤ教主導者たちはニューヨーク市に集められた、ある緊急の会議のために。
その会議は極秘のものではありませんでしたが、それはまた公開されて行われたものでもありませんでした。
そのユダヤ教主導者たちは保守的な活動の議会であり(二人を欠いた状態)- 国際結婚についてどうするかを決定するためにそこに集まった。
1970年より、その保守的な活動は、ユダヤ人と非ユダヤ人との間の結婚を公式に認めることや、式に参列することさえ禁止してきた。
その宗派は改革や復興主義の運動よりも歴史ある存在であるが、その宗派がその宗教主導者たち自らに対する国際結婚の疑問の取り決めを許すことになる。
しかし、時間の経過とともに、保守的なユダヤ主義者らはまた正統派の慣行よりも現代の生活を容認する意思をも示した、宗教の最も敏感な方針の一つの内側からの挑戦への明らかな弱みを残して



もう、時間か…全然早く読めない…

英語の勉強

今日はこちらを訳します。
間違って読んでいる可能性がありますので、すべてを真に受けないでください。

www.theatlantic.com


タイトル:お片付けの経済学
出版から数か月が経過し、日本の家庭組織の指導者、近藤真理恵さんの書籍がーその書籍は「断捨離」に関するものーいま最も関心される書籍に至った。
行動科学がその魅力を説明します。

-
「この本には、あなたの人生を変える方法として、どのようにしてあなたの空間を配置するかということが、まとめられています」
これは近藤麻理恵さんが書いたベストセラー書籍「人生がときめく片付けの魔法」の最初の熱意ある一文です。
直接かつ迷いないこの文章は彼女の哲学を真に響かせています。
多くの自助的な書物とは違い、的外れな単語は含まれておらず、気に入られようとすることもなく、こびる文章が少ない、真実の文章がそこにはある。

昨年の10月に英語版にて彼女の書籍が出版されたけれども、彼女に対するGoogleトレンドはいまだ高い関心がほぼずっと続いている。
日本語での検索結果もまた似たような結果となっている、2010年に日本語版が出版されているのに
もしGoogleサーチが何も意味しなかったとしても、片付けに関しては関心はまた高い状態にあり、この関心の高まりの要因は近藤さんの方法の登場にあるに違いない、その方法とはただ幸せをもたらすという一点にこだわったものである。
この断捨離に従い、近藤さんは身の回りの物を取り出しやすく、めちゃくちゃになりづらい方法について、明確な方向性を示しています。
多くのジャーナリストは彼女の方法を実践し、そして「彼女は私の人生を変えてくれた」という感謝の言葉が多くあります。
SNSの何でも聞いてという近藤さんの書き込みにて、一人の熱心なファンが10歳以下の子供たちにあなたの方法を教えるにはどうすればよいのか聞いています。



はい、ということで感想です。

意味が頭に入ってくるのに日本語で表現できない文章がありますね。(おもしろ!)

近藤さんの片付けの技術はアメリカで大絶賛されてますね、こうして海外の記事を読んだときに活躍する日本人を見つけると、なんだか嬉しくなりますね。

英語の勉強

さっそく、二日連続でさぼってしまった…

また訓練を続けてみたいと思います。
今日は朝と夕方の2回に分けて頑張ってみます。

次の記事を読みました。
www.theatlantic.com

タイトル:ミリヤム・ミルザハニー,最初の女性:勝利した人 数学の最も高い賞について が亡くなる 40歳で

ミリヤム・ミルザハニー氏の仕事は未来の知見を変えたかもしれない その知見とはどのように宇宙が形成されたかというもの
-
ミリヤム・ミルザハニー:最初にして唯一次の賞を獲得した女性が 土曜日に亡くなりました 名声高いフィールズ賞(功績をあげた若き数学者に与えられる賞、数学のノーベル賞とも呼ばれる)。
ミザルハニー氏はスタンフォード大学の教授で、大学は公式発表しました、内容は 彼女の乳がんが骨まで転移して死に至ったとのことです。彼女は40でした。
ミザルハニー氏は著名な賞を獲得しました、それは4年に一度与えられる賞で、2014年に彼女の幾何学と動力学の技術体系の功績に対してのものでした。
彼女の功績のほとんどは学術的に高度で、スタンフォード大学の声明によると、まるで「外国語」とも読めてしまうと思いますね、領域の外側の人にとっては モジュライ空間(普遍なパラメータ空間)、タイヒミュラー理論(リーマン面の分類、先のモジュライ空間と関係)、双曲幾何学(負の曲率を持つ曲田空間における幾何学)、エルゴート理論(力学に関与)そしてシンプレクティック幾何学(斜交ベクトル空間とか、新プレティック形式に関する…)



はい、ということで
途中から、道を逸らしてしまって、あっという間に30分経過してしまいました。
彼女の功績は、門外漢にとってまさに外国語ですね。
世界は人類の未来の認識を変えうる重要な方を失ってしまったんだな
それは人類にとって、とても大きな損出であったと思い知らされる記事でした。

英語の勉強

今日はこの記事を訳してみます

www.theatlantic.com

Title:問題を起こす人
同一の特徴、それはドナルドトランプJr氏を彼の父親の政治的な相続人とする、は、彼を最新のスキャンダルの真っただ中に置いてしまうのかもしれない。

もう何十年も前、トランプ氏の長男がまだ少年だったころ、バーバラ記者(有名な女性記者)がドナルドトランプ氏を彼の家族の同席のもと取材したことがあった。
その時彼女は不動産王の彼に対し、どの子が家族の中で問題を起こす子だと思っていますか?と尋ねました。

トランプ氏はためらいなくすぐに"ドン"であると受け答えたと、当のドン自身の話によって明かされる。
ドンことドナルドトランプJr.氏(39歳のビジネスマン)は嬉々として語ってくれた。

ドン Jr. 氏は私が昨年の人物紹介で取材に訪れたときに、ある物語を歯を見せるような笑顔で語ってくれた。
"私は三人の中で最もヤンチャだったんですよ"と自身の兄妹について語った。
"いつも成績は良く、いい行いもしていましたが、その分たくさん遊んでいましたね"

元気よく、強い意志を持って、危機負担もある、そんな彼の特性はトランプの子供たちの中でドンJr.氏を最も目立つ存在としていたわけです、トランプ政権中は。
しかし、今週の暴露―2016年6月のメールの交換が火曜日に公開され、そのメールにはドンJr.氏が協力的なロシア政府からの政治的な援助運動の可能性が示された内容に肯定的な返事"そいつはいい!"をしていたという―これがこれまでの彼の特性を今までとは異なる場所へと投げ込んだことになった。
もう一度、ドンJr.氏は彼の父親にとって問題を起こす子だったわけだが、今回は遊びやゲームの度をはるかに越えた問題である。



…途中でやめられなくなって、30分以上作業してしまいました
ちょっと、政治的な単語知らな過ぎて読めない…
あと、Quality って今回は人の性格とか、特性って感じでとらえてよかったのかな?


うーむ、ひとまずの目標は30分で記事の最後までスラスラ訳せるようになることかな
明日も頑張ります。

追記:
って、あれ!元記事を読み直したら
以下の表現が変化してた
by Barbara Walters with his family present.

by Barbara Walters, along with his family.
確かに、下の方が誤解なく、"家族と一緒に"が伝わりますね。
修正前は、"家族の存在とともに"というより、場合によっては"家族への贈り物とともに"とも受け取れちゃうかも

英語の勉強

とりあえず一日30分は英語の記事を読んでみようと思います。

次の記事を読んでみた(30分だけ)
www.theatlantic.com

ちゃんとした訳ではなく、私が英語を読んで感じたことなので、信じないように…

タイトル:それらがすべて本当だとしたら何だというのか?
ここ数か月、トランプ大統領とその側近は主張を続けてきた、内容としてはいかなる提案の談合、相手がロシアで、そしてそれが偽物であると
しかし、もしトランプ政策が意欲的に情報をロシア政府から受け取りたいというスタンスだったなら、ほかに何か起こりえたのだろうか?

ここ数か月、噂、暗示、そして出どころの怪しい主張、それらは談合に関するもので、相手はトランプ政策とトランプ陣営とロシア政府というものがワシントンの周りを渦巻いていたわけで、時々大きな洪水が吹き出すように、そして常にゆっくり流れる小川のように
何回もドナルドトランプ氏とその味方は否定してきた
彼ら曰、そこに接触はなかった、選挙の前には



うーん、こりゃひどい
全然進まない…
もっとスラスラ読めるようになりたいですね
明日も頑張ります