WEBVTT

00:00.300 --> 00:06.270
こんにちは､ そして私たちの創作活動の超エキサイティングな部分､ 私たちがそれをスマートにする部分へようこそ｡ 

00:06.270 --> 00:13.260
それこそ､ AIを訓練することで知能が鍛えられ､ 達成させたい目標に到達できるようになるわけですね｡

00:13.260 --> 00:19.020
そのためには､ 基本的にニューラルネットワークを訓練して正しい予測を出力するようにします｡ そして､

00:19.020 --> 00:24.360
脳からのこれらの出力信号がすでに身体に正しく伝達され､ 最終的なアクションを演じることができるので､

00:24.360 --> 00:27.510
すべてがすでに準備万端です｡

00:27.510 --> 00:32.220
だから､ 基本的にこれからやろうとしていることは､ 以前からやっていたことなんです｡ 

00:32.220 --> 00:37.410
メモリからランダムなバッチを取り出し､ これらのサンプルから入力を得て､ 出力を得て､

00:37.410 --> 00:42.810
ターゲットを得て､ 予測を得て､ 予測とターゲットの間の最後の領域を計算し､ そして､

00:42.810 --> 00:51.660
この最後の誤差にどれだけ貢献したかによって重みを更新するために確率的勾配降下法で後方伝搬を実行するだけでいいのです｡

00:51.750 --> 00:53.040
だから､ これを全部やりましょう｡ 

00:53.040 --> 00:58.140
これを実装するためのツールはすでに揃っているので､ とても簡単だということがおわかりいただけると思います｡

00:58.140 --> 01:04.740
オプティマイザーやロストファンクションなどのPyTorchツールだけでなく､ 以前に作ったすべてのクラス､

01:04.740 --> 01:10.530
たとえばもちろんブレインも､ 予測を得るために使うことになります｡

01:10.530 --> 01:17.640
そして､ 私たちの経験､ 再生､ 実装､ 適格性追跡､ これらすべてのツールをPyTorchのツールに組み合わせることで､

01:17.640 --> 01:24.360
学習が超高性能になり､ その結果､ 最終的に超強力なAIを手にすることができるのです｡

01:24.540 --> 01:26.340
だから､ このトレーニングを実現させましょう｡ 

01:26.340 --> 01:28.260
AIを賢くしよう｡ 

01:28.260 --> 01:33.390
そしてこれから行うのは､ トレーニング中に誤差を計算するときに使う最後の関数と､

01:33.390 --> 01:37.860
オプティマイザを取得すること､ これが最初に行うことです｡

01:37.860 --> 01:40.590
では､ 最後の関数の変数を作ってみましょう｡ 

01:40.590 --> 01:42.390
それを損失と呼ぶことにする｡ 

01:42.720 --> 01:50.550
そして､ これはRNモジュールからのMSI損失関数と等しくなる｡ 

01:50.760 --> 01:56.910
そして､ MSIロスは､ 基本的に予測はQ値なので､ 最後に使う関数です｡

01:57.120 --> 01:59.940
さまざまなアクションのQ値を予測しているのです｡ 

01:59.940 --> 02:05.970
したがって､ これらは実数なので､ まあ､ 回帰のためのニューラルネットワークをやっているようなもので､

02:05.970 --> 02:09.060
したがって､ 最後の関数は平均二乗誤差です｡

02:09.060 --> 02:12.090
これが一般的な回帰に使う最後の関数です｡ 

02:12.420 --> 02:13.020
わかりました｡ 

02:13.020 --> 02:16.290
さて､ 最後の関数ができたので､ オプティマイザーを手に入れましょう｡ 

02:16.440 --> 02:21.240
このoptimizerは､ optimizerのために作成した変数です｡ 

02:21.240 --> 02:23.940
そして､ いつも通りの撮影をする｡ 

02:23.940 --> 02:31.950
自動運転車に関しては､ アトムオプティマイザーという非常に強力なオプティマイザーがあり､ トレーニングに大きな効果を発揮してくれることでしょう｡

02:31.950 --> 02:36.060
だから､ これをその原子まで持っていこう｡ 

02:36.780 --> 02:39.990
そして､ それはまさに自動運転車のためであることを忘れないでください｡ 

02:39.990 --> 02:42.930
2つの本質的な議論をインプットする必要があるのです｡ 

02:42.930 --> 02:52.890
オプティマイザーとニューラルネットワークのパラメータ､ つまり脳のニューロンの重みの間の接続を行うものです｡

02:52.890 --> 02:56.880
そして､ そのために､ CNNと呼ばれる私たちの脳を取り上げるのです｡ 

02:56.880 --> 02:59.220
それが､ 私たちが作った脳のオブジェです｡ 

02:59.220 --> 03:03.210
それで､ CNNはパラメーターを覚えていない｡ 

03:03.450 --> 03:04.320
これでよしとしよう｡ 

03:04.320 --> 03:06.120
そして､ いくつかの括弧｡ 

03:06.270 --> 03:12.660
つまり､ オプティマイザーとAIの脳内ニューロンの重みを結びつけているわけです｡

03:12.690 --> 03:18.870
そして､ 第二引数は学習率で､ これは誤差で与えられる｡ 

03:18.870 --> 03:33.360
というのも､ あまり早く収束させたくなく､ ある程度の探索をしたいからです｡

03:33.360 --> 03:33.360
01が1％開いていること｡ 

03:33.360 --> 03:36.450
それは自動運転車に使ったものと同じだと思います｡ 

03:37.390 --> 03:40.570
それでは､ 最後の関数､ オプティマイザーを紹介します｡ 

03:40.570 --> 03:43.450
というわけで､ フルループの開始まであと少しです｡ 

03:43.450 --> 03:46.060
さて､ 実は今すぐ全ループを開始します｡ 

03:46.060 --> 03:51.250
でも､ その直前にエポック数の大きさを決めるんです｡ 

03:51.250 --> 03:58.390
AIを学習させるので､ このエポック数に対応する新しい変数をここに作成します｡

03:59.290 --> 04:02.360
そして､ それを100と等しく設定しましょう｡ 

04:02.380 --> 04:04.790
それは､ 目を鍛えるには十分な方法でしょう｡ 

04:04.810 --> 04:11.350
そして､ AIは100歳よりずっと前､ たとえば20歳とか30歳とかでベストな状態になることに賭ける｡ 

04:11.380 --> 04:12.010
見てみよう｡ 

04:12.010 --> 04:13.870
でも､ とりあえず100点取ろう｡ 

04:13.870 --> 04:16.060
そして､ 必要であれば､ 増やしていく｡ 

04:16.060 --> 04:17.980
しかし､ その必要はないだろうと思います｡ 

04:18.420 --> 04:18.620
なるほど｡ 

04:18.640 --> 04:26.880
エポック数が決まったので､ エポック数分の学習を行う際に､ このforループをメインループにすることができます｡

04:26.890 --> 04:31.520
そのため､ 繰り返される変数はエポックとなります｡ 

04:31.540 --> 04:34.450
それが､ エポック・インを選ぶということです｡ 

04:34.930 --> 04:44.710
もちろん､ 最初のエポック1からエポック数まで､ レンジ関数で指定します｡

04:47.130 --> 04:51.960
プラス1､ 範囲の上限は含まれないと覚えておいてください｡ 

04:51.960 --> 04:58.920
したがって､ 100まで行こうと思ったら､ まあ､ 指定してボックスプラス1でないと､ 100まで行けないわけです｡

04:59.400 --> 05:00.960
では､ コリンさん｡ 

05:00.960 --> 05:03.030
そして､ 今度はループの中に入ってみましょう｡ 

05:03.600 --> 05:03.930
わかりました｡ 

05:03.930 --> 05:08.550
そこでまず､ 10ステップを200回実行します｡ 

05:08.550 --> 05:13.810
そのため､ 各エポックは10ステップを次々に200回実行することになる｡ 

05:13.830 --> 05:18.420
そのために､ 経験豊富なリプレイ・クラスのこの実行ステップ関数があるのです｡ 

05:18.420 --> 05:23.400
したがって､ この関数を使用するには､ 実際にはメソッドであるメモリ・オブジェクトから取得します｡

05:23.400 --> 05:32.520
メモリ・オブジェクトはリプレイ・メモリ・クラスのオブジェクトで､ 10ステップの200回の実行を生成するには､ メモリ・オブジェクトを取得する必要があります｡

05:33.350 --> 05:36.140
それは､ 私たちがここで作ったものだと思い知らされます｡ 

05:36.140 --> 05:43.520
Memory は､ MN ステップが 10 ステップで､ 容量が 10,000 のリプレイメモリクラスのオブジェクトである｡ 

05:43.790 --> 05:56.630
このオブジェクトを作り､ このオブジェクトから､ よく､ このラン､ ステップ､ 関数､ ランのステップを取り､ 10ステップの連続したランを200回指定するのです｡

05:56.930 --> 06:00.680
そのため､ 各エポックでは基本的に200ステップを実行することになります｡ 

06:00.740 --> 06:09.110
そして､ 各エポックで200ステップを実行したところで､ これらの実行からいくつかのバッチをサンプリングする時が来ました｡

06:09.110 --> 06:10.610
そして､ これらのバッチを試食すること｡ 

06:10.610 --> 06:19.100
もうひとつ､ サンプルバッチという関数がありますが､ これは200回分の実行からいくつかのバッチを正確に生成します｡

06:19.340 --> 06:25.010
しかし､ これらのバッチは､ 一連の遷移のこれらの時間のバッチであることを忘れないでください｡ 

06:25.010 --> 06:31.640
以前は､ ここで1回の遷移を何回かに分けてバッチしていたのですが､ それが10回になったということです｡

06:31.640 --> 06:47.060
今回は､ 10ステップ､ 10トランジションのバッチを作成することになります｡

06:47.060 --> 06:53.690
また､ バッチサイズについては､ 32､ あるいは64､ あるいは128を取ることができます｡ 

06:54.050 --> 06:57.140
バッチサイズの場合は､ 一般的に使われているものと覚えておいてください｡ 

06:57.140 --> 07:03.620
これは､ ニューラルネットワークのアーキテクチャにおいて､ バッチ学習を行う際に一般的に見られることです｡ 

07:03.620 --> 07:05.600
しかし､ 今回はまったく違います｡ 

07:05.600 --> 07:11.630
10ステップのいくつかのバッチをサンプリングしているだけなので､ もっと大きなサイズでバッチを取った方が良いですね｡ 

07:11.630 --> 07:14.990
だから､ 64や128を取ることができるわけです｡ 

07:14.990 --> 07:17.000
だから､ 128を取る｡ 

07:17.240 --> 07:29.090
なぜなら､ いくつかのバッチを取得し､ このサンプルバッチ関数によって返されるものを取得するからです｡

07:29.330 --> 07:38.750
つまり､ このforループは､ 128ステップごとに､ メモリがサイズ128のバッチを生成し､

07:38.750 --> 07:47.390
そのバッチには､ 直前に実行された128ステップが含まれることになります｡

07:47.810 --> 07:54.230
ちょうどサイズ128のバッチがいくつか出てきていて､ これらのバッチで学習が行われることになります｡ 

07:54.230 --> 07:59.660
さらに､ このバッチ内では､ 10ステップごとに学習するために､ 適格性､ トレースランニングを行うことになります｡

08:00.200 --> 08:00.620
わかりました｡ 

08:00.620 --> 08:07.550
このループの中では､ 1つのエポックではまだ起こっていますが､ 今回は特定のバッチで起こっています｡

08:07.670 --> 08:14.300
そこで､ まず最初にインプットとターゲットを別々に用意することにしました｡ 

08:14.450 --> 08:16.610
そして､ そのことは､ 先ほどもお話したように､ とても簡単なことです｡ 

08:16.610 --> 08:21.500
私たちが実装したツールの1つであるEligibility traceを使えば可能です｡ 

08:21.500 --> 08:28.160
このように､ この eligibility trace 関数はバッチを入力として受け取り､ 今度はバッチを出力として､

08:28.160 --> 08:32.270
入力とターゲットを返します｡

08:32.270 --> 08:37.640
そこで､ 今すぐできることは､ 入力とターゲットとなる2つの新しい変数を作成し､

08:37.640 --> 08:42.290
この入力がターゲットに来るようにすることです｡

08:43.220 --> 08:44.000
イコールです｡ 

08:44.030 --> 08:48.840
この適格性追跡関数がバッチに適用される戻り値を正確に示します｡ 

08:48.860 --> 08:52.190
そこで､ この関数をループのバッチに適用することにします｡ 

08:52.190 --> 08:55.340
それで､ どうするかというと､ 資格だけです｡ 

08:56.410 --> 09:00.340
ループのバッチに適用されるトレース｡ 

09:00.640 --> 09:04.210
さて､ これで入力と目標ができました｡ 

09:04.210 --> 09:08.020
でも､ PyTorchでは､ いつも何かやらなければならないことがあるんです｡ 

09:08.020 --> 09:13.510
そしてもちろん､ これはニューラルネットワークの入力､ またターゲットをいくつかの拷問変数に変換することであるが､

09:13.510 --> 09:15.220
リリースはない｡

09:15.220 --> 09:16.140
新しいことは何もありません｡ 

09:16.150 --> 09:17.430
私たちはその方法を知っています｡ 

09:17.440 --> 09:18.460
こうすればいいんです｡ 

09:18.460 --> 09:26.740
インプット､ そしてターゲット､ まあ､ 可変インプットと同じになるわけです｡ 

09:27.740 --> 09:33.800
それはインプットと変動するターゲットに対してであり､ ターゲットに対してです｡ 

09:34.070 --> 09:34.880
わかりました｡ 

09:35.210 --> 09:44.130
つまり､ 脳の入力はトーチ変数に変換され､ ターゲットもトーチ変数に変換されるのです｡

09:44.150 --> 09:48.530
これで､ ニューラルネットワークに入力ができるようになったわけです｡ 

09:48.530 --> 09:50.120
そして､ なぜこのようなことをする必要があるのでしょうか｡ 

09:50.150 --> 09:55.430
それは､ 次のステップとして､ 我々が持っている予測､ 目標とする入力を得るためです｡ 

09:55.460 --> 10:02.360
もちろん､ 予測値は必要です｡ なぜなら､ 予測値と目標値の間の損失を計算することになるからです｡

10:02.900 --> 10:06.570
では､ この予測をもとに入手しましょう｡ 

10:06.590 --> 10:07.910
さて､ 改めて考えてみると､ これはとてもシンプルなことですね｡ 

10:07.910 --> 10:14.750
あとは私たちの頭脳であるCNN､ つまり畳み込みニューラルネットワークを､

10:14.750 --> 10:16.970
入力に適用するだけだ｡

10:17.240 --> 10:18.140
これでよしとしよう｡ 

10:18.230 --> 10:23.480
入力はニューラルネットワークに入り､ ニューラルネットワークは予測を出力する｡ 

10:24.150 --> 10:24.870
完璧です｡ 

10:24.870 --> 10:28.560
だから､ 今は予測ができて､ 目標があるから､ 損失を出すことができるんだ｡ 

10:28.560 --> 10:30.030
そして､ それが次のステップになるのです｡ 

10:30.210 --> 10:35.070
今は最後のエラーを取得するためにlast関数を使っているので､ last関数とは異なるので､

10:35.070 --> 10:39.900
新しい変数を導入することにします｡

10:39.930 --> 10:48.960
このため､ 誤差が少なく､ 最後の関数を予測に適用して得ることができます｡ 

10:49.650 --> 10:51.360
そして､ そのターゲット｡ 

10:52.170 --> 10:52.980
これでよしとしよう｡ 

10:53.370 --> 10:55.020
すべてがスムーズになった様子をご覧ください｡ 

10:55.050 --> 10:56.160
すべてがロジカルです｡ 

10:56.160 --> 10:58.230
まずターゲットをインプットします｡ 

10:58.230 --> 11:00.540
そして､ その入力のおかげで､ 予測ができる｡ 

11:00.540 --> 11:03.960
そして､ 予測とターゲットのおかげで､ 誤差を少なくすることができるのです｡ 

11:04.990 --> 11:07.200
だから､ とてもロジカルでスムーズなのです｡ 

11:07.210 --> 11:09.040
そして､ 次はどうするのか｡ 

11:09.070 --> 11:10.770
まあ､ 同じ論理の道筋です｡ 

11:10.780 --> 11:17.080
これで最後に戻ることができ､ この少ない誤差をニューラルネットワークに伝搬して重みを更新します｡

11:17.080 --> 11:22.150
確率的勾配降下を行うには､ オプティマイザーが必要です｡ しかし､

11:22.150 --> 11:26.290
アトムオプティマイザーはすでにここにあります｡

11:26.290 --> 11:29.230
しかし､ 今この時点で､ 私たちが何をしなければならないかを思い出してください｡ 

11:29.230 --> 11:32.380
それを初期化するために､ 初期化をしなければならない｡ 

11:32.380 --> 11:40.780
オプティマイザーオブジェクトを取得し､ ゼログリッド法を適用していることを思い出してください｡ 

11:41.460 --> 11:41.920
では､ 行ってみましょう｡ 

11:41.920 --> 11:45.240
それを初期化する括弧を忘れない｡ 

11:45.360 --> 11:50.900
そして､ 次のステップは､ 最後のエラーをニューラルネットワークに逆伝播することです｡ 

11:50.910 --> 11:58.960
そのために､ 前回のエラーを取り込んで､ バックワード・メソッドを適用するのです｡ 

11:58.980 --> 12:02.010
まさに逆伝播を応用しているわけですね｡ 

12:02.010 --> 12:09.780
そして最後に､ 最後のエラーが新しいネットワークに逆伝播されたので､ 確率的勾配降下法を用いて重みを更新することができるのです｡

12:10.260 --> 12:17.190
そのために､ オプティマイザーを使って､ このステップメソッドを適用するのです｡ 

12:17.370 --> 12:18.310
これでよしとしよう｡ 

12:18.330 --> 12:20.120
ウェイトが更新されました｡ 

12:20.130 --> 12:25.740
先ほどお話したように､ すでにやっただけでなく､ 今ではとてもシンプルで自然なことのように思えます｡ 

12:26.070 --> 12:28.520
だから､ 今度は楽しいことをしよう｡ 

12:28.530 --> 12:36.040
エポックごとに平均報酬を表示し､ AIがどうなっているか､ トレーニングがどうなっているかを追跡できるようにします｡

12:36.060 --> 12:40.530
エポックの段階を経て､ 平均報酬が増加していく様子を見たい｡ 

12:40.530 --> 12:44.040
そして､ 最初はもちろん､ この探索の段階があります｡ 

12:44.040 --> 12:49.680
ですから､ 最初のうちは平均報酬が増えないかもしれませんが､ その後､

12:49.680 --> 12:58.860
搾取の段階になると､ 確実に平均報酬が増え､ あるレベルまで増えて､ 最速でベストに到達することになるのです｡

12:59.310 --> 13:01.470
では､ まずプリントから｡ 

13:01.980 --> 13:07.500
1つのエポックでこれをやっているので､ ここでループに戻る必要があります｡

13:07.500 --> 13:16.380
そして､ 最初のエポックとカラム､ そしてパーセントSEを表示します｡

13:16.710 --> 13:21.300
そして､ 平均報酬を加算していきます｡ 

13:22.540 --> 13:25.300
そして､ パーセンテージも加えていきます｡ 

13:25.600 --> 13:27.880
そして､ 引用を終了します｡ 

13:28.960 --> 13:30.700
そして､ パーセントを追加する｡ 

13:30.700 --> 13:42.940
そして反対側には､ EPCに相当する1人目の変数と､ これから計算する平均報酬に相当する2人目の変数を入力します｡

13:42.940 --> 13:45.670
つまり､ 平均報酬という変数はまだ存在しないのです｡ 

13:45.670 --> 13:47.770
今すぐにでも作りたい｡ 

13:48.010 --> 13:52.120
そこで､ STRエポックを使用することにします｡ 

13:52.450 --> 13:55.450
epochが数値であっても､ それを文字列に変換する｡ 

13:55.450 --> 13:57.340
その方がいいし｡ 

13:58.030 --> 14:02.080
平均的な報酬となりうる星を追加する予定です｡ 

14:02.080 --> 14:08.140
そして､ VGリワードと呼ぶ変数を作成します｡ これからこの変数を作成し､

14:08.140 --> 14:10.000
計算を行います｡

14:10.960 --> 14:12.430
では､ こうしてみましょう｡ 

14:12.430 --> 14:13.930
それしか残っていなかったんです｡ 

14:13.930 --> 14:16.090
だから､ 私たちはすでにエポックを持っているのです｡ 

14:16.120 --> 14:20.140
では､ 平均報酬を計算しましょう｡ ここで､ 計算する必要があります｡ 

14:20.140 --> 14:28.210
まだループ内ですが､ バッチループからは外れています｡ バッチがサンプリングされ､ バッチ内でトレーニングが行われているからです｡

14:28.210 --> 14:32.080
しかし､ 今は前方伝搬＋後方伝搬が一括で行われている｡ 

14:32.080 --> 14:44.920
エポックループに戻り､ 累積報酬を計算することができるようになりました｡

14:44.920 --> 14:51.490
ステップの実行中に､ ステップで起きている累積的な報酬を得ることができるように､ ステップを実行します｡

14:51.490 --> 14:59.500
そこで､ 今それを使ってステップの新しい報酬を更新し､ 累積報酬を移動平均オブジェクトに追加して平均を再計算することで､

14:59.500 --> 15:07.750
移動平均オブジェクトを更新することにします｡

15:07.750 --> 15:10.090
そうして平均的な報酬を得ることになるのです｡ 

15:10.480 --> 15:11.500
では､ こうしてみましょう｡ 

15:11.500 --> 15:14.890
まず必要なのは､ 更新される報酬です｡ 

15:14.890 --> 15:17.140
だから､ リワードと呼ぼう｡ 

15:18.080 --> 15:19.010
ステップス

15:19.250 --> 15:24.000
そして､ 先ほど言ったように､ PNのステップを踏むのです｡ 

15:24.020 --> 15:30.830
ここで作成されたリマインダであるオブジェクトは､ 経験リプレイファイルからPNステッププログレスクラスのオブジェクトなので､

15:30.830 --> 15:33.530
PNステップオブジェクトです｡

15:33.920 --> 15:39.710
そして､ リワードのステップを追加し､ さらに括弧をつける｡ 

15:39.710 --> 15:43.930
さて､ これで新しいステップの累積報酬が得られます｡ 

15:43.940 --> 15:50.930
さて､ ではこれらの新しい累積報酬を移動平均オブジェクトに追加する必要があります｡ 

15:50.930 --> 15:57.320
そして､ これを行うために､ 今回は移動平均クラスで､ このADDというメソッドを用意しました｡ 

15:57.410 --> 15:58.220
だから､ とてもシンプルなんです｡ 

15:58.220 --> 16:05.330
移動平均オブジェクトを100ステップで作成し､ ADDメソッドを使用します｡

16:05.330 --> 16:15.350
ADDメソッドでは報酬ステップを入力し､ これによりステップの報酬が移動平均に追加されます｡

16:15.950 --> 16:16.340
わかりました｡ 

16:16.340 --> 16:22.220
そして最後に､ 平均報酬を計算するのですが､ これはまあ､ ここでも同じ変数ですね｡

16:22.640 --> 16:26.720
それが平均的な報酬と同じになるわけです｡ 

16:26.720 --> 16:33.440
そして､ それを得るためには､ 今回､ 移動平均オブジェクトから平均メソッドを使用すればいいのです｡ 

16:33.590 --> 16:45.650
移動平均はADDメソッドによって追加された新しい報酬ステップですでに更新されているので､ このようにドット平均を行うのです｡

16:46.350 --> 16:46.930
素晴らしい｡ 

16:46.970 --> 16:50.130
それでは､ 平均的な報酬をここに入力します｡ 

16:50.130 --> 16:53.160
そして､ これはエポックごとに印刷されることになる｡ 

16:53.430 --> 16:53.850
わかりました｡ 

16:53.850 --> 16:54.960
だから､ もういいんです｡ 

16:54.960 --> 16:57.150
だから､ 結果が出るのがとても楽しみなんです｡ 

16:57.150 --> 17:01.620
そして実は､ 次のチュートリアルで結果を見ながら､ サプライズを用意する予定なんです｡ 

17:01.620 --> 17:03.600
だから､ かなりエキサイティングなことになりそうです｡ 

17:03.600 --> 17:06.960
それで､ 今はAIと遊んで楽しむ時期なんでしょうね｡ 

17:07.620 --> 17:11.380
では､ おいしいコーヒーか紅茶を用意してください｡ 

17:11.400 --> 17:16.950
それでは､ 椅子にゆったりと腰掛け､ AIが「Doom」をプレイしているとてもクールな映像をご覧ください｡ 

17:16.980 --> 17:18.750
では､ 次のチュートリアルでそれをやってみましょう｡ 

17:18.750 --> 17:20.040
そしてそれまで､ お楽しみに｡ 

17:20.040 --> 17:20.460
I.
