
1.今週の予定
3カ月に一回の休みを取るのを忘れていたので、先週は一週間しっかり休みました。
今週もこの順序に従って勉強していきます。
- 映像作成用UE5の勉強
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強もしくはVroidとUE5の勉強
- Houdiniの勉強
- AIについての調査(ComfyUIの勉強)
- DirectX12の勉強
2. 映像作成用UE5の勉強
2.1 PCGの勉強
2.1.1 前回の復習
前回のBlogを読み直しました。
前回は壁の内側や床の裏側の天井を追加するための実装を追加していました。
後、この実装を利用して神社を作成するのはどうかと書いていました。
今週は神社の建設物の調査から始めます。
2.1.2 神社の構造物を理解する
神社がどういう建築物なのか理解していません。
そこから調査します。


あれ?
なんか全然違います。
これは神社の中にも色々な建物があってそれぞれの建物毎に特徴があるからかもしれません。
調べます。
分かりました。
神社は以下のような造りになってるそうです。

神社にある建物には、楼門、参拝所(拝殿)、社務所、そして本殿があります。
それぞれについても調べます。
<楼門>
楼門(ろうもん)は、社寺建築に用いられる二階建ての門で、一階部分に屋根がないのが特徴だそうです。
二階には屋根があり、高欄(こうらん)が取り付けられることが多いそうです。
Google検索のAIでは以下の回答でした。
- 二階建て: 楼門は上下二階建ての門です。
- 下層に屋根なし: 一階部分には屋根がなく、縁(はし)の腰組(ようくみ)が組まれています。
- 上層に屋根: 二階部分には屋根があり、切妻造り(きりづまづくり)の屋根が一般的です。
- 高欄: 二階の縁には高欄(こうらん)が取り付けられ、渡り廊下などと繋がるように作られることもあります。
- 社寺建築: 楼門は、神社や寺院の門として使われることが多いです。
- 二重門との違い: 楼門は下層に屋根がないのに対し、二重門は下層にも屋根があります。
だそうです。
縁(はし)の腰組(ようくみ)とか切妻造り(きりづまづくり)の屋根とかよく分からない用語が沢山あります。
出てきた写真も載せておきます。

ああ、これだ。私がImageする神社の形状ってこれでした。
正面の写真もほしいですね。

灯篭がありますね。

こっちは狛犬があります。
それは兎も角、この門は中に入れるんでしょうか?

これは凄い。
神社によっては赤くない楼門もあるんですね。
<参拝所>
これは更に調査したら一寸間違っていました。
御社殿という建物があり、その中に拝殿、幣殿、そして本殿があるそうです。
この拝殿が、参拝する建物だそうです。
GoogleのAIに拝殿の定義を聞いてみました。
拝殿(はいでん)とは、神社の本殿の前にある建物で、参拝者が拝礼を行う場所です。
はい。写真を探して確認します。

おお、賽銭を入れる賽銭箱がある建物です。
他の写真も探します。

赤くないですね。
拝殿って赤くないんでしょうか?
GoogleのImage検索の結果です。

2個だけ赤い建物があります。
拝殿は赤くないのかもしれません。
建物自体の構造はそれぞれの写真で全然違うのでよく分からないです。
取りあえずこんだけ理解したら今回は十分です。
毎週一寸ずつ調査して理解を深めていきます。
<追記>
凄い事を思付きました。
楼門の周りに使用されている塀をまず作成します。
これなら複雑なPCGを組む必要もないはずです。
来週からこれに取り掛かります。
2.1.3 Here's How to Adjust Your Building Based on the Asset Size | UE 5.4 P2 [1]の20分から勉強する
<25:10 - Weight Control>
Buildingの一つの階を見ると違うMeshを使用していても同じ大きさに統一されています。

確か実装した時にWeightをつけたはずです。
PCG Scale Wall Sizeノードを開くと

以下の様になっています。

ここの実装のMatch And Set AttributesノードのPropertiesを見ると

があります。
しかし実際に使用するのは以下のMatch Weight Attributeの方だそうです。

これをEnableして値にWeightをSetします。
結果です。

何も変わっていません。
DA_RegularBuildingを開き

Index[0]のWeightの値を3.0に変更します。

結果です。

5つ同じMeshが続いて形状が違うMeshが現れました。
え、これがWeightの調整だったの?
違う形状のMeshの大きさを変更するのかと思ってた。
<25:50 - Repeating Design Fix>
ここでこのDesignのある欠点について説明してるんですが、その欠点の意味が分かりません。
先程のWeightの値を1に戻しますが

欠点は同じままだと言っています。
分かった。

こうやって縦から見るとTopかBalconyのあるWallのDesignは全て同じWallが選択されています。(この場合は全部TopのあるWallが採用されています。)
どうもTutorialはこれにばらつきを追加したかったみたいです。
それが出来てないのでここで怒ってるようです。
でも「25:10 - Weight Control」でMeshがEvenly Spacedされてるから直すって言っています。
これ言葉通りの解釈をしたらMeshの大きさをそれぞれのMeshの種類に応じて変更する事をやると思いますよね。
うーん。
縦から見るとBalconyのあるWallのDesignは全て同じWallが選択されている問題は、それぞれの階の生成の時に使用されるSeedの値が同じだからだそうです。
それを直します。
PCG Copy Point Up Advancedノードを開きます。

以下のTransform Pointsノードを

PropertyにあるRecompute SeedをEnableします。

これでそれぞれの階でSeedの値が変更されるようになったそうです。
以下のPCG Copy Point Up Simpleノードも同様の変更を行います。

これは床や天井の生成に使用される方のNodeです。
結果です。

同じ列にあるWallにも拘らずTopのあるWallだったりBalconyのあるWallだったりしています。バラつきが出来ました。
横から見た方が分かり易いです。


それぞれの階でBalconyのある部屋の位置が変わっています。
<26:51 - Floor Size Hard Code Fix>
Floorの実装を見ると以下の様に300という値をそのまま使用しています。

この値は実際に使用するMeshから直接値を得るように実装を改良します。
そうすればどのSizeのMeshをFloorの使用する事も出来るからです。
うーん。
これは前にやらなかったかな。この部分の実装を説明してなかったので自分でそういう風に実装した気もしています。
この辺は実装する時に確認します。
今はTutorialの言う通りに作成します。
まず以下のCodeをDuplicateします。

そしてFloorに使用するためのGet Property From Object Pathノードの

Property Nameの値をFloorに変更します。

WidthとDepthの大きさはWallと同じである必要があるため、以下の様にGet Actor Propertyノードを繋げます。

ここで問題になるのはHeightの値です。
これはFloor/Ceilingの厚さに対応する値です。
この値を指定するVariableはまだ作成してないのでここで作成します。
BPに以下のVariableを作成しました。

Variableの設定は以下の様に変更していました。

この辺は壁のVariableの設定と同じです。
Slider Rangeの最小値に1をセットする事で最小値が1以下になる事を防いでいます。
他のVariableでSlider Rangeの最小値が1にセットされてないものもここで直していました。
PCG Scale Wall SizeノードのHeightに今作成したVariableであるFloorCeilingThicknessの値をPassします。

Get Actor Propertyノードを使用してBPのFloorCeilingThicknessの値を取得しました。
以下のようにPCG Scale Wall Sizeノードを繋げました。

Match And Attributesノードは要らないので最終的には以下の様になります。

結果です。

これはSizeの違うMeshをFloor/Ceilingに使用しないと本当にこの実装で大丈夫なのかは確認出来ないですね。
Tutorialはそこまではしていませんでした。
いや、やってるのか?


<28:56 - Randomize Windows / Set Seed>
結果です。

これでも十分ですが、更にBalconyのRandom化を追加したいそうです。
さっき、TopのあるWallとBalconyのあるWallをRandomにしたばかりですが、それとは違うんでしょうか?
BPに移動して以下のVariableを作成しました。

あ、先程作成したSeedの値をParameterから指定出来るように実装を変えるのか。
何をやりたいのか理解しました。
そして先程のSeedの値を指定したMatch And Attributesノードに以下のような実装を追加します。

Get Actor Propertyノードは当然ですがSeedの値を取得出来るように設定を変更しています。
当然、PCG Scale Wall Sizeノードの内部の実装も同じように変更する必要があります。

以下に示した様に実装を変更しました。

InputにSeedが追加され、その値がMatch And AttributesノードのSeedにPassされています。
Inputに追加されたSeedの設定は以下の様になっています。

そうか。SeedのTypeはAttribute Setなのか。
このAttributeって具体的に何を指しているのか今一、分かってないです。
PCG Buildingに戻ってSeed Inputが増えたPCG Scale Wall SizeノードにSeedの値をPassしました。

Testします。


Seedの値を変更するとBalconyのあるWallの位置が変化します。
出来てますね。
ここでこのTutorialは終わっていました。
2.1.4 Here's How to Adjust Your Building Based on the Asset Size | UE 5.4 P2 [1]の20分から最後までを勉強した感想
要は、今回のTutorialではBalconyのあるWallをRandomに表示するための機能を追加する方法を勉強したという事です。
ただやり方は複雑で、どのNodeをどういじったらこういう機能が追加出来たのかを、今ここで一言で説明しろ。と言われると出来ません。
その辺の複雑さがPCGの勉強が中々終わらない原因な気がします。
さっさと次のStageであるPCGを使用して自分で自由に建物を作成する段階に到達したいです。
2.2 Level Sequence上でAnimationの編集をする方法
2.2.1 前回の復習
前回はIK boneを追加しまいた。
一応、完成したんですが、肘の向きが逆に曲がってしました。


今週はこれの直し方を調査します。
2.2.2 肘の曲がる方向を直す
なんかUE5を開くのも久しぶりな気がします。
前回、Tutorialと違う設定にした箇所が2つあります。
この部分をTutorial通りにしてみます。
まずSecondary AxisのYの値を-1.0に変更します。

更にPole Vectorの値を計算してるGet Transform-ControlノードのNameにLower ArmのControlをセットします。

結果です。

片方だけSetした場合は、前回のBlogに載せた以下のような形状に変化してしまいますが、

両方セットした場合は腕の形状は普通になりました。
手のIK Controlから動かしてみます。

おお、肘の向きが正しくなりました。
手首の向きがオカシイのは仕方ないですね。
正面から見た場合も確認します。

肘の曲がる向きはあっています。
直りました。
一応、手首のRotationも直しておきました。

後は、Get Transform-ControlノードのSpaceの設定がGlobal Spaceなのが気になります。

ここはTutorialではLocal Spaceにセットされていました。
こっちは色々いじったけど分かりません。
Local Spaceに変更すると以下の様になります。

2.2.3 Creating and Modifying Control Rig [2]の続きを勉強する
思ったより簡単に問題が解決したので Creating and Modifying Control Rig [2]の続きを勉強する事にします。
<Debugging>
半分位見たところで時間が無くなってしまいました。
のでCreating and Modifying Control Rig [2]の続きの勉強は来週やる事にします。
3. AIの勉強
3.1 前回の復習
前回何を勉強したのか覚えていません。その復習から始めます。
前回のBlogを見ます。
あ、Lecture3(Lesson 3: Practical Deep Learning for Coders 2022[3])を勉強してたんだ。
かなり沢山勉強してますね。
結局、こうやって無理して余計に勉強しても、後で勉強しなくなってTotalで見たら同じか少ない量になってしまうのか。
毎日、コツコツ勉強するのが一番早いとはよく言ったものです。
前回のBlogの内容を読み直しました。
前回の勉強で最も重要な箇所は、二重誤差を計算し、その平均値を損失として損失関数を定義してその損失の最も少ない値を探す方法を勉強した事ですが、Lectureを勉強しただけでは、損失関数とか二重誤差などの専門用語が出て来ません。
これらの用語は、後でGoogleのNotebookLMで作成したMind Mapで出て来た用語です。
これで勉強した方が速くて深くLectureの全体像を掴めると思いました。
ので今回はNotebookLMのまとめから勉強します。
3.2 Lesson 3: Practical Deep Learning for Coders 2022[3]のNotebookLMのまとめを勉強する
Mind Mapを見ると以下の線形代数とReLUからが今週勉強する範囲なはずです。

<線形関数とReLU>
ReLUと言う言葉は初めて聞きました。以下の解説を見ると

Rectified Linear Unitの略のようです。負の値を0にする事を指してるのでしょうか?
Copilotに聞いたら以下の回答が返って来ました。

分かりました。
xの値が0以下の場合は、0を返しそれ以外の場合はxの値そのままの値を返す関数です。
AIにおけるGradientの問題を解決すると書いてあります。
mとbの値を決定するのにPartialな方法と@interactによる方法を使用してるようです。
<複数のReLUの組み合わせ>
ReLUの定義が上記であってるなら複数のReLUなんてある訳ないです。
これは以下の複数の線形関数をReLUに通して加算してるという意味でしょう。

これを行う事で、任意の複雑な関数の近似が可能になったり、多次元Dataへの適用が可能になったりするようです。
複数のReLUの組み合わせという表現が間違ってると思ってこのNodeをClickしたら

NotbookLMがその内容について調査してくれました。

以下の回答を得ました。

やっぱりReLUを組み合わせると言っています。
更に以下の解説が追加されていました。

なるほど。
これで一寸は理解出来ました。
複雑な形状の実験結果を表すための式はなかなか見つかりません。
そこで簡単な線形関数であるmx+bにReLU関数を使用して非線形にします。
非線形になったmx+bはその時点でかなり複雑な形状の実験結果の近似式を示す事が出来ますが、さらに複数のReLUを組み合わすともっとも複雑な形状の実験結果に一致する式を作成出来るという事のようです。
行列積による効率的な計算とか、勾配降下法による計算とかは実際のLectureを見た時にどこでどのように使用するのかを確認します。
<行列の乗算>
以下の内容がこの中に入っていました。

これは行列の計算方法の復習してるだけっぽいです。
先にいきます。
<Spreadsheetでの機械学習モデル構築(Titanic)>
これは実際にDeep Learning内で計算してる最適化の計算をExcelで自分でやるみたいですね。
そのための手順を説明してるようです。

ここに書かれてる作業の一つ一つが、よくNeural Networkの図にあるNodeと対応するんでしょうか?
そんな気もします。
<特徴量Engineering(P-class)>
「Spreadsheetでの機械学習モデル構築(Titanic)」にあった「カテゴリカル変数の数値化(isMale, Embarked, P-class)」のP-Classについての解説です。

これ見るとP-Classの解説というより、P-Classの使い方を説明してるみたいですね。
「N Levelのカテゴリカル変数にはn-1個のダミー変数が必要」という説明は意味が分からなくてもなんか心に残りますね。
これは次のLectureで勉強する内容のようですね。

自然言語を処理する方法は今回勉強したやり方とは一寸違うようですね。
<休憩>
これは何を話してるか何の情報もありません。Clickして更なる情報を表示してもらいました。

だそうです。
3.3 Lesson 3: Practical Deep Learning for Coders 2022[3]のNotebookLMのまとめを勉強した感想
NotebookLMのまとめで勉強した方がはるかに早く内容を理解出来ます。
Mind Mapを使用する事で全体像をぱっと理解する事が可能です。しかも深く知りたい箇所はClickする事で、詳しい解説が表示されます。
英語のLectureも日本語で完璧に訳してくれるので、日本語しか出来なくても何も問題ない点もかなり脅威です。
これはCopilot負けるわ。
ただしYouTubeのTutorialに関してはまだAIより勝ってると感じました。
実際の作業になると、映像で見たら一発で理解出来るのに文章で説明されるとよく分からない場合が多々あるからです。
そう言う訳でYouTubeのTutorialの方がまだ一番でしょうね。
3.4 Lesson 3: Practical Deep Learning for Coders 2022[3]の続きを見る
<43:18 ReLu: Rectified linear function>
二重誤差を計算し、その平均値を損失として損失関数を定義してその損失の最も少ない値を探す方法は、先程の例のような簡単な式で表せる場合でしか使用出来ません。
しかしある方法を使用するとどんな複雑な形状のGraphでも式で表す事が出来るようになります。
まず以下の式を使用します。

Rectified Linear Functionが出て来ました。
Tutorialの説明によるとy= m*x + bがLinearの式だからLinearと呼ぶそうです。
成程。
後この式で計算した結果が0より大きいかどうかを評価しています。
更に以下の実装を追加しました。

mが1、bも1を指定しています。
このCodeのPartialの意味が分かりません。
Copilotに聞きます。

成程、PartialはRectified Linear Functionのmとbの値を1に指定した新しい関数を作成したのか。
結果です。

あれ?
0以下は0なはずです。
-1と0の間の値は0になっていません。
こっちが正しいみたいです。
0以下ではなくてless than 0が正しいようです。
こういう所の翻訳は間違っていますね。NotebookLMでも。
今度はmとbの値が調整出来るように@interactを使用して以下のような実装を作成しました。

これが先程言ってた

の中身なの?
偉い簡単ですね。
いや、NotebookLMを使用してるからこんなに簡単に理解出来るのか。
結果です。

そもそも正解が分からないのでmとbの値が調整出来てもそれで?って感じです。
<45:17 Infinitely complex function>
次に以下のFunctionを作成しました。

先程、以下の様に書きましたが

ReLU関数を複数組み合わせていますね。
以下の実装を更に追加しました。

結果です。

それぞれのParameterの値を変更するとPlotの形状が複雑に変化しました。
これを利用して複雑な形状の実験結果に一致する関数を作成するのか。
ここでは2個のReLU関数を使用していますが、実際は大量のReLU関数を使用するそうです。
更にここでは2次元で計算していますが、表面のような3次元に拡張する事も可能だそうです。
ただしこの方法を使用するにはParameterの値が必要です。しかしそれはGradientから得る事が出来ます。
はい。
これがDeep Learningです。
おお、そうなのか。
まだこの計算式が以下の図と統合するのか分かりませんが

まあDeep Learningの秘密の第一歩に踏み込んだようです。
この説明を聞いて、数年前にある生徒が以下のような話をしたそうです。

Owlを描くのに2つの〇を最初に描いています。
これに先程の手法がそっくりだ。と言ったそうです。
これ実験結果の近似式を得るためのたとえ話としてはかなり俊逸だと思うんですが、NotebookLMはこの部分の話は完全に無視していました。

<49:21 A chart of all image models compared>
色々なModelがあるが、この方法を使用してどのModelが最も実験結果にあう関数を作成出来るのか調べる事が出来るのではないか?という質問を受けています。
で早速試すようです。

まずConvnextという名前のModelを全部表示させています。
これJupyter Labでやってますね。

あ、Paper Spaceでやってるのか。

そして以下の実装を追加しました。

うん。
これは先程の式と比較してどのModelが優秀なのかを調べてるんじゃないくて、単に全部のModelでVision_learner()関数を使用してるだけです。
Vision_Learner()とReLU関数って同じ事なのかもしれませんが、どうなんでしょう?
NotebookLMのまとめだとこの辺の話は全部端折ってるようです。
計算が終わりません。
ので以下のGraphの結果を見てその答えを代用しています。

またTipになりますが、Modelの選び方として、最初に一番早いModelを選択して、その結果の精度に満足いかない場合は、精度が高いが時間がかかるModelを選択していくのが良いそうです。
<52:11 Do I have enough data?>
あ、また生徒からの質問を聞いています。
ここは質問に対しての回答をする時間のようです。
十分なDataを持ってるかどうかを判断するにはどうしたら良いのか?という質問です。
でProfessorの回答ですが、あるDataでModelを作ってその回答があってたら十分なDataがあると判断する。だそうです。
成程。
後、Dataが足りないという時は大体、LabelがされたDataが足りないとか、SegmentationされたDataが足りないとかいう場合がほとんどだそうです。
<54:56 Interpret gradients in unit?>
次の質問です。
2次関数のa,bそしてcの微分を計算しましたが単位がありません。
そしてそれらの値そのものを小さな値で掛けないのですか?と言う質問です。
そのものを小さな値で掛けないとは最小二乗法とかで最適化しないのかと言う意味なのでしょうか?
この質問に対する回答ですが、
まず実装部に戻って以下の実装を表示しました。

以下の実装を表示しました。
まずUnitに対する質問の回答です。

ここでaは何々、bは何々と説明しますが正直意味分かりません。
<56:23 Learning rate>
次に、直接それらの値そのものを小さな値で掛けない理由の説明です。
ある実験結果にもっとも一致する関数の解を求めるに当たって、ある説があるそうです。
それは解が最適解に近い状態ではどんな場合でも以下に示したようなquadraticな式の解になるそうです。

まあ、最適解が最小値もしくは最大値になる訳ですから、近似的には絶対こうなります。
緑の点を調査します。

微分すると傾きが出ます。
緑の点はかなり大きな傾きを持っています。
のでその傾きの値を使用して次の値を決定すると以下の様に最小値、つまり最適解を逃してしまいます。

なので以下の様に最初の値に関係のない小さな値を繰り返し使用して最適解を探していきます。

そしてこの小さな値は特別にLearning Rateと名付けられています。
<1:00:14 Matrix multiplication>
Matrixの掛け算についての解説です。

Deep Learningで行列の話が出るとLinear Algebraを大学院で何年も勉強しないと理解出来ない印象を受けるそうですが、実際にDeep Learningで必要な行列はこのMatrixの掛け算だけだそうです。
以下の例を使用して実際に計算してみせてました。

行列の掛け算のやり方は常識すぎるのでここでは省略します。
NotebookLMではこの部分は以下の様にまとめられていました。

GPUによる高速な処理とか、高校での学習経験とか、Lectureで一瞬しか言ってないです。
負の値を0に置き換える話はしてましたが、それがNeural Networkの一層に当たるとは思っていませんでした。やっぱりこの計算は以下の図と対応してるのね。

<1:04:22 Build a regression model in spreadsheet>
ここから実際にExcelを使用して実際にDeep Learningで使用されているMatrixの掛け算の計算式を作成します。
おお、やっとNotebookLMのまとめにあったExcelを使用して実際にModelを構築するのか。
一応NotebookLMのまとめを確認します。

Regression Modelが機械学習モデルと訳されていますね。
内容です。

結構ある。
でも一個ずつ見てみるとそんなに難しくはなさそうです。
軽く全部見ておきましょう。
<<KaggleのTitanic CompetitionのData>>
これは単なるDataの紹介でしょう。このDataをExcelにCopyして計算式を作成していくはずです。
<<ExcelでのData準備(不要な列の削除、欠陥地の処理)>>
Excelに移したDataを整理してるだけでしょう。
<<カテゴリカル変数の数値化(isMale、Embarked、P-Class)>>
これが分からん。まずカテゴリカルが何を意味してるのかが不明です。さらにDataにある値に対してある関数で何かの計算をしてるのは間違いないですが、それぞれの関数、isMale、Embarked、そしてP-Classがどんな関数なのか全く分かりません。
P-Classに関しては後で解説があるみたいです。
<<Randomな初期係数>>
初期係数はRandomに決める以外ないという事か、Randomに決めてもそんなに問題ないという事でしょう。
<<Dataの正規化>>
はい。これもやると言ってたのでここでやるのか。と言うだけの事です。
<<目的変数の設定(Survived)>>
これは何をやってるのか全く分かりません。
Tutorialを見て確認しましょう。
<<線形Modelの計算(SUMPRODUCT)>>
これはReLUをやる前に線形でModelを作成してある程度の検討でもつけてるのかもしれません。
<<バイアス項の追加(定数1の列)>>
これは数列に1の列を追加してるはずです。
何のためのそんな事をするのかは不明ですが、数列に全ての値が1の列を追加してるはずです。
<<Loss Functionの計算(二重誤差)>>
これは前回やった、二重誤差を計算し、その平均値を損失として損失関数を定義してその損失の最も少ない値を探す方法をここでやるという事です。
ただしここでは二重誤差を計算し、その平均値を損失として計算するところで終わってそうです。
<<Excel Solverによる勾配降下法での最適化>>
最適解をSolverを使用して求めるようです。Solverを使ったらここで説明した計算方法と計算方法が違っちゃう気がします。
<<ReLUの追加によるNeural Networkの構築>>
ここでReLUによる計算です。
Loss Functionの計算をやった後で、ReLUをやるんでしょうか?
それともLoss Functionの計算とは別にReLUをやるんでしょうか?
<<行列の乗算による効率化>>
これは先程の説明であったReLUを繰り返しする計算を行列の乗算で簡単にする方法の説明でしょう。
よし、Tutorialをみて確認しましょう。
いきなり以下のExcelを開きました。

これはKaggleの以下のURLに飛んで

DataのTrain.csvを開きます。

右上にあるDownloadを押すとこのExcelで開いたDataがDownload出来るそうです。
このDataにSurvivedとPclassというCategoryがありますね。
SurvivedとPclassは別にDeep Learningの計算方法の一部ではなくこのData特有の内容のようですね。
DownloadしたFileを開くと以下の様になっています。

いやこれは既に要らないColumnはRemoveした後だそうです。
以下のColumnだけ残したそうです。

それぞれのColumnの意味について簡単に説明していました。
Survivedは生き残ったかどうかだそうです。
PClassは船のどの階級だったかそうです。
以下の場所に詳しい解説が載ってます。

Dataが無いのは削除してます。

これって削除なんでしょうか?
次にこれらの値に係数をかけるんですが、以下のような言葉には係数をかける事が出来ません。

ので以下の様に数字に変換しました。

Embarkedも同様にしました。

を

と言う風にです。
Embarkは船に乗った港名の頭文字です。
更にP Classは一等席、二等席、そして三等席を表す言葉で、数字で表示されていますが連続性は無いです。

のでこれも以下の様に書き直しました。

以下の場所にRandomな数字を作成しました。

一体何を?と思ったらこれは消してしまいました。
後で重要になってくるかもしれないので記録には残しておきます。
Dataを見ると分かりますが、Fare(運賃)の値段が他の値に比べて大きすぎます。

Normalizationをするのか。
最初にAgeのNormalizationをしました。

最大値で割っていました。
Fareの計算は少し違うそうです。
極少数の人が大金を払って、ほとんどの人は僅かなお金しか払っていません。
その場合は以下の様にLogすると値の変化が安定するそうです。

で本来はこの後Normalizeするんですが、面倒だったのでしなかったそうです。Normalizeしなくてもそんなに結果も変わらなそうだったからだそうです。
これで以下のDataの値のバラつきが0~1の間に大体収まりました。

それで以下の場所に戻るんですが

これ何やってるか分かりません。
単にRandomな値を指定してるだけでしょうか?
今度は以下のLinearのCellを選択しています。

こんな計算式が表示されていました。

うむむ。
分からん。
最後のConstについて解説しています。

この値はColumnの最後に追加したOnesというColumnで全て1という値を保持しています。

ここからDeriveしたそうです。
うーん。
全体の計算方法が分らん。
今度はLossの計算方法を説明しています。

うーん。
これだけ聞いても全体の計算方法が理解出来るとは思えません。
軽く流していきます。
Solverを使用してLossを計算します。

Total Lossの値が0.1になりました。

ここまではRegressionによる計算です。
今度はNeural Networkを使用して計算します。
<1:16:18 Build a neuralnet by adding two regression models>
と思ったらもう時間が無くなってしまいました。
残りは来週やります。
4. Nvidia Omniverseの勉強
4.1 NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial [4]を勉強する
今週もROS and ROS 2 Installation [5]の勉強の続きをやります。
4.1.1 前回の復習
前回の勉強から2週間もあいてしまったので、何をやったのかあまり覚えていません。復習します。
分かりました。
Windows11でWSL2を使用してIsaac SimからROS2を使用出来るようになったんです。
そして最後に以下の部分だけやってないので来週これをやります。と書いて終わっていました。

4.1.2 vision_msgs_packageとackermann_msgs_packageのInstallについて調査する
もう先々週に何をやったのか全然覚えてないので今週は、この2つのPackageについて調べるだけにします。
まずCopilotに質問してみます。

回答です。

うーん。
よく分からない。
けどInstallしておいて損はないはずです。
既にInstallしてる可能性もあるのでそれをまずCheckします。
Copilotにそのやり方を聞いてみました。

以下の回答が返って来ました。

本当にAIって便利ですね。
早速試してみます。

ム.
ROS2を起動させないと駄目なんでしょうか?
これもCopilotに聞いてみます。

やっぱりSourceをする必要がありますね。

何も回答が無いです。
Copilotの回答です。

で以下のCommandでInstall出来るそうです。

一応、Directoryの場所は何処でも良いのか確認しておきます。

良いようですね。
公式のInstall用のCommandも以下のようになっています。
sudo apt install ros-humble-vision-msgs
やってみます。
まずUpdateしました。

特に問題なさそうです。
次にvision_msgs_packageをInstallします。

出来たんでしょうか?
先程のCommandで確認してみます。

出来てますね。
次にackermann_msgs_packageをInstallします。
これも同じ様にやって行きます。
ackermann_msgs_packageについて質問しました。

これは理解出来ますね。
Ackermann Steeringと言うのがあるのか。
一寸だけAckermann Steeringについて調べてみますか。

うーん。専門的過ぎる。
なんかImageがみたいですね。
Google検索したらGoogleのAIが以下の回答をしました。

前輪が曲がらなかったそもそも曲がれないじゃないですか。
どういう事なんでしょう?
あ、内側のWheelの方が外側のWheelより鋭く曲がるようになってる。と書いてありました。
成程。
今はこれだけ理解出来たら十分ですわ。
Installの続きをします。
ackermann_msgs_packageがInstallされてない事を確認しました。

ではInstallします。
CopilotのInstallするためのCommandです。

公式SiteのCommandです。
sudo apt install ros-humble-ackermann-msgs
同じですね。
Installします。

出来たんでしょうか?
確認します。

Install出来ました。
4.1.3 Issac Simを起動してAckermannのNodeが使用出来るか確認する
今回は何の問題もなくLauncherからIssac Simを開けました。
TutorialのProjectを開いて

Action Graphを開きAckermannでNodeを検索すると以下の3つが出て来ました。

うーん。
ackermann_msgs_packageがIssac Simから使用出来るようになったのかは不明ですが、Ackermannと名の付いたNodeが表示されるようになったので、前の時より前進したのは間違いないですね。
まずTutorialでどんなNodeを使用してるのかの確認から始めます。
2025-02-23のBlogで勉強していました。

今、このProjectを見ると

ROS2ですが全く同じ名前のNodeがありますね。
Auto Graph上に配置したら以下の様なNodeでした。

ROS1のSubscribe AckermannDriveノードです。

ROS2の方がInputが多いですね。
でもこれくらいならAIに聞いたらどう設定したらいいのか分かりそうです。
今週はこれくらいにしておきます。
4.2 Nvidia Omniverse Issac Sim [5]の勉強
4.2.1 前回の復習
前回何を勉強したのか全く覚えていません。
復習します。
Reinforcement Learning Policies Examples in Isaac Sim [6]の実装をやっていました。
それぞれのRobotが動くのを確認しただけです。

残りの実装は来週やると書いて終わっていました。
流石にこれを今週やる気は起きません。
これは来週やる事にします。
先々週、どんな勉強したのかだけ復習しておきます。
<Policies Files>から実装していませんね。そうかPolicyの使用方法を勉強するのか。
でDownloadしたPolicyを以下のCommandで使用してるんですが、

このCommandってどこから打ち込むのかが分かりません。
今週はそれを調べる事にします。

むう。
最初のPythonを使用してIsaac Simを動かすTutorialを勉強する必要があるかもしれませんね。
一寸それを見てみます。
Quickstart with Isaac Sim [7]の以下の箇所に

PythonでIsaac Simを動かす方法が書いてありましたがよく分かりません。
よく考えたら別にPythonを使用しないでもPolicies FileをIsaac Simから使用する事が出来るかもしれません。
Copilotに聞いてみました。

なんかPolicies Fileを直接Load出来そうですね。
こっちを試してみますか。
でもそれは来週やる事にします。
今週はここまでにします。
5. Gaeaの勉強もしくはVroidとUE5の勉強
なし
6. Houdiniの勉強
6.1 前回の復習
前回は途中で、何をしてるのか分からなくなったので実装を中止したはずです。
まず先週のBlogを読んでどこまで実装したのか復習します。
以下の様に書かれていました。

RestノードはFrame毎に変化する必要の無い実装をUpdateしないで保持するためのNodeです。
別にこの箇所の理解が難しいという事は無いです。

Restノードは既に実装されていました。
ここからは2025-03-30のBlogで勉強した内容を実装していきます。

Rest Attributeが生成されています。
よく分かりませんがこれで良いはずです。
MATERIALSノード内に移動します。
Pの代わりのRestを使用します。
ここからの作業が結構複雑でしかも何をしてるのかがよく分かっていません。
失敗しても良い様に別なProjectとしてSaveしてやる事にします。
Sphere Bodyノードを消してしまいます。
これが結構大事だと思っていたんですが、よく見たらSPHERE_BODYノードは何の実装もしてなかったです。

消しても問題ないです。
消しました。
Baseノードの実装をDuplicateします。
名前をSphere_Bodyに変更します。

しました。
さらにBindノードを追加して

そのParameterにあるNameの値をRest、Typeを3Floatに変更します。

しました。
このNodeをGlobal Variableノードの代わりに使用します。

しました。
この後Renderingした結果が載っていますが、どうやってRenderingしたのか忘れてしまいました。
調べます。
Render Viewに移動してRender buttonを押すんでした。
結果です。

うーん。
変ったのかよく分かりません。
Render Viewは画像一枚しか生成してくれないのでAnimationで確認が出来ません。
Tutorialを見直してどうやってAnimationを生成してるか確認します。

まずTutorialでも画像で確認していました。Animationにはなっていません。
分かりました。Sphereの表面にBumpinessとMotion Blurが追加されていると言っています。
確認します。
まずBumpinessは確実に追加されています。

Motion Blurは分かりません。
そもそもMotion Blurがどんな現象なのかも知らないです。
Copilotに質問してみます。
Motion Blurの一般的な意味です。

対象物が高速で動いているため、写真に撮った時にその対象物が線状に見えたり、不鮮明になる事を指すそうです。
あ、分かった。
そういう事か。
でもTutorialの画像を見る限り、Sphereは変わっていません。
私のSphereもMotion Blurが生じてる感じは無いです。
まあ良いでしょう。
後は、最後にLightを実装しますが、これは来週やる事にします。
先週、お休みしたにもかかわらず今週は時間が足りなくなってしまったので、今週のHoudiniの勉強はここまでとします。
7. AIについての調査(ComfyUIの勉強)
もう勉強する時間があまり無いので先週の復習だけやります。
7.1 前回の復習
先週は休みで、先々週のBlogを見たら

先々週も何もしてなかったです。
2025-03-30のBlogが前回の勉強になります。
はあ。2週間ぶりの勉強になるのか。
しかも今週はあまり時間が取れません。
大分、遅れてしまっています。
Blogを見ると Learning Agents (5.5)[8]と Learning to Drive (5.5) [9]を勉強していました。
この2つの勉強内容を復習します。
7.2 Learning Agents (5.5)[8]の勉強内容を復習する
<What is Learning Agents?>
Learning AgentsはUE5のPluginでUE5のCharacterにAI(Machine Learning)の学習が出来るようにします。
2025-03-30のBlogではこの辺の文章はあまりしっかり読んでないですね。
<Who is Learning Agents for?>
ここは初心者から専門家、更にはAIの研究者というあらゆる層向けにこのPluginは作られています。と言った事が説明されています。
初心者には優しいけど、専門家には物足りない。とかAIの研究者からは相手にされない。とかは、あるいはその逆に専門家や研究者向けで初心者は何をして良いのか全く分からないし、ネットで聞いても全然優しくないと言う事も無いって事です。
これってずっと当たり前だと思っていたんですが、NvidiaのOmniverseとか勉強すると本当に初心者には優しくないです。
世間はあまり気が付いていませんが、この初心者から専門家までを差別なくCoverしてるのがUE5とそのCommunityの凄い所です。
<How does it work?>
ここはどんな言語を使用してるのかとかの説明です。
2025-03-30のBlogには以下のように書いてあります。

やっぱり一回読んだだけじゃ、全然理解してないですね。
<Getting Started>
次のTutorialの紹介があるだけです。
これで終わりです。
特に復習する必要もなかったかもしれません。
7.3 Learning to Drive (5.5) [9]の復習をする
今度はこっちのTutorialの復習をします。
<Initial Setup>
Projectの作成方法をStep by Stepで説明しています。
前回の勉強では

と怒っていますが、こういう所をしっかり説明するからUE5は初心者から専門家まであらゆる層から支持されている訳です。
<Playtest>
車の操作方法を説明してるだけです。
<Clean Up the Map>
Level上にある要らないMapを消しています。
<Enable Learning Agents Plugin>
Pluginを使用するための手法が説明されています。
<Learning Agents Manager>
ここからLearning Agent Mangerについての解説が始まります。
で前回(2025-03-30のBlog)勉強した時には気が付かなかったんですが、この節の中に
- Create the Manager Blueprint
- Registering Agents with your Manager
- Logging
の3つの小節があったんです。
だからこの3つはAgent Managerについて語っていたんです。前回勉強した時はそれが分かっていませんでした。
Learning Agents ManagerはActor Componentで、全てのLearning Agentsの元になるものだ的な説明がされていました。
あ、思い出してきました、そう言えばまずBPを作成してそこにLearning Agent MangerをComponentにして追加しました。
大きく行って以下の2つの役割があります。
- 色々なAgentのReferenceを保持するためのData Structure
- Learning Logicを特定する
おお、これ勉強した記憶が残っています。
やっぱり全然覚えていないといってもそれなりに記憶の片隅に残っていますね。
Multiple agents are handled in a batch for efficient processing. Agents can be any UObject, which means you are unrestricted on what can be an agent.
ここの説明は全部重要ですね。
Efficient Processingでは沢山のAgentをいっぺんに扱う事が出来ます。更に全てのUObjectはAgentとして扱う事が出来るそうです。
UObject全部Agentとして扱えるという事は、UE5にある全てがAgentとして扱う事が出来るという事です。
The manager is extended by a set of listeners which add to the manager’s functionality: the Interactor, Trainer, Recorder, to name a few. We will dive into some of these classes later in this tutorial.
このManagerの機能はInteractor、Trainer、そしてRecorderなどのListenerを使用する事で拡張出来ます。
うん。
これも実際の実装方法を勉強した記憶があります。
こういう小さな文章でも重要ですね。
<<Create the Manager Blueprint>>
BPにLearning Agents Managerを追加する方法を解説しています。
<<Registering Agents with your Manager>>
Agentは全部ManagerのRegisterする必要があります。
具体的な方法としては

でやります。
<<Logging>>
AgentがManagerにRegisterされたらLogで報告されるそうです。
だそうです。
はあ。今こうやって見直すと全部Learning Agent Mangerについての解説でした。
前回勉強した時はここまでは理解してなかったです。
<Manager Listeners>
Manager Listenerを追加する事で、ManagerがAgentに対して何か有用な事が出来るようになります。
この節のよく分からない所は、この後の節でLearning Agents Interactorを説明してるんですが、これらがこの節の小節にはなってないんですね。何故なんでしょう?
<Learning Agents Interactor>
Interactorの説明です。
The interactor is responsible for defining how the manager’s agents interact with the world through observations and actions.
まさしくInteractionしてますね。
2025-03-30のBlogでは以下の様にまとめられていました。

今、この節を読むとこの説明は間違っていますね。
以下の様に書かれています。
The interactor has four main functions we need to override for our game: SpecifyAgentObservation, SpecifyAgentAction, GatherAgentObservation, and PerformAgentAction.
つまり、InteractorにはこれらのFunctionがあり、AgentとInteractするためにはこれらの4つのFunctionをOverrideする必要があると言っています。
更に2025-03-30のBlogでは更に以下のように述べています。

これは完全に間違って理解していますね。
Interactorにはこれらの4つのFunctionがあるとは言っていますが、この4つのFunctionを順番に使用して実装して行くとは一言も述べてないですから。
<<Observation Example>>
でObservation Exampleの話に入って行くんですが、2025-03-30のBlogでは以下のように述べています。

成程ね。
Interactorの節でInteractorの機能を間違って理解してしまったので、この先の分の流れが予想と違って来てしまって動揺しています。
でもその事が分かったので、今度、もう一回このTutorialを読むときはもっと正確に読む事が出来るでしょう。
今週の「AIについての調査」はここまでにしておきます。
来週、このInteractorについて勉強し直す事にします。
8. DirectX12の勉強
なし。時間が無くて出来ませんでした。
9. まとめと感想
なし。
10. 参照(Reference)
[1] Procedural Minds. (2024, August 11). Here’s how to adjust your building based on the asset size | UE 5.4 p2 [Video]. YouTube. https://www.youtube.com/watch?v=xVMz-LW1SJw
[2] Creating and Modifying Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/5vL/unreal-engine-creating-and-modifying-control-rig/DnO1/unreal-engine-creating-and-modifying-control-rig-overview
[3] Jeremy Howard. (2022, July 21). Lesson 3: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=hBBOjCiFcuo
[4] NVIDIA Isaac Sim - MUSHR RC Car - Ackermann Tutorial. (n.d.). YouTube. https://www.youtube.com/playlist?list=PL60qgWqGu6k82AJ2SDWOscEKLjCc5tdEW
[5] What is Isaac Sim? — Omniverse IsaacSim. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/index.html
[6] Reinforcement Learning Policies Examples in Isaac SIM — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/robot_simulation/ext_isaacsim_robot_policy_example.html#isaac-sim-policy-example
[7] Quickstart with Isaac Sim — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/introduction/quickstart_isaacsim.html#isaac-sim-app-intro-quickstart
[8] Learning Agents (5.5). (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/bZnJ/unreal-engine-learning-agents-5-5
[9] Learning to Drive (5.5). (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/7dmy/unreal-engine-learning-to-drive-5-5