スクラブ&スパ「アクア」

ブログ

競艇 ディープラーニング

・ドロップアウト層を追加する 以前は日経平均が上がるか下がるかを予測していましたが、少し気分を変えてボートレースの結果を予測してみようと思い立って実装しました。 今回の私の使用した範囲のデータだと、選手が1627人だったので、入力は9762次元となります。, 出力は、1位~3位さえ予測できればよかったです。1位の予測には6次元のベクトルで、それぞれの要素が1番艇~6番艇が1位となる確率を保持しているものとします。2位と3位についても同様の出力を用意し、合計で18次元のベクトルが出力となります。 What is going on with this article?    ・input_shape:入力されるデータの形状を設定する  ①とある問題を予想するためのモデルを定義する。(例えば、「競艇の一位を予測するモデル」) 誤差をE、Ykを出力層の各出力値、Tkを正解値と定義すると 予想精度をより高くなるように学習を行う。, ニューラルネットワークの学習の目的は重み・バイアスを調整し、 でよく使用されます。, ・交差エントロピー誤差 このユニットは3要素の入力を受け取り、計算した結果を次のユニットに出力します。, そして、ニューラルネットワークのユニットは学習を進めることで、 What is going on with this article?  内容もPythonを使用して実際にコードを書いていきますので、理論と実装方法を なお、最適化アルゴリズムの設定はmodel.compileメソッドで行います。, ・確立的勾配降下法(SGD) ・epochs:訓練データ全ての反復回数 ・Function APIを使用する, ・keras.layers.Denseクラス 訓練するためにはfitメソッドを使用します。, fitメソッドの引数は以下の通り ②では3連単予想モデルの作成とハイパーパラメータのチューニングについて説明する予定です。. - 選手の進入分布 レース結果には、参加した選手の選手番号、着順、タイム、レース会場などの情報が保存されています。 ・はじめてのディープラーニング More than 1 year has passed since last update. ① 入力層で受け取った情報を中間層、出力層に順に伝えていく。 Help us understand the problem. なお作成したプログラムの都合上、選手のファウル・落艇などでゴールしたのが5艇以下のレースはテストケースから除いてあります。また、舟券購入に伴うオッズの低下等も想定していません。よって、以降に示す的中率等の結果は実際よりも若干高く出ている可能性があることに注意してください。, 散々な結果です。的中率が低い上、オッズが低いレースしか的中していないので、収支が大幅なマイナスとなっています。, 出力ラベルが一定のしきい値(今回は0.45)を上回るレースのみを対象として試してみます。 説明いたしました。  そちらについては別記事を投稿する予定ですので、お楽しみに!), --2019/9/9追記-- ・batch_size:訓練データを更新するタイミング(訓練データ数)  標準化はsklearn.preprocessingのStandardScalerクラスを使用しています。, ここまでやれば訓練データとテストデータが作れていますので、 以前投稿した株価予測シリーズと同様、なんとかお小遣いを増やせないか、という取り組みの一環です。 二乗和誤差は出力値と正解の差を二乗し、全ての出力層のユニットで総和をとった 「肉が食べたいか?」・「友人の予定」・「ダイエットしたいか?」を入力値とします。, このとき、「友達と一緒なら焼肉食べようかな...」 交差エントロピー誤差は出力値Ykの自然対数と正解Tkの積の総和を 学習がストップしてしまうという欠点があります。, ・RMSprop  こちらの本ではTensorFlowやKerasなどのディープラーニングでよく使用される 実際に予測したい未知のデータに対して正しく推測できなくなってしまうことです。, 通常、ニューラルネットワークのモデルを作成・学習する際は学習用の訓練データと 高い性能を発揮することが多いです。, 勾配消失問題とは、出力層から入力層への逆伝播を行う中で、重さ・バイアスの更新量である What is going on with this article?        早期終了するべきかを定義する。 ・x:訓練データ(Numpy配列) 「すぐに更新量が小さくなってしまい、学習がストップしてしまう」 【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_知識編 .        その結果を次の中間層・あるいは出力層に渡します。 ブログを報告する, はじめに 前回に引き続き、Peters' NoteのPart 4 Vectorization…, はじめに 以前、TensorFlowのBasicRNNCellを使用して文字レベル…, ニューラルネットワークを実装する [Part 4 バックプロパゲーションのベクトル化], 今回はレース場やレースのグレードなどの情報は使用していないので、それらの情報も学習時に使用する. ・L2正則化:過学習を抑えたい際に使用, 早期終了とは学習を途中で打ち切ることです。 (axisの順番が逆でした。間違い訂正済み), 欠損値を任意の値で埋めることができます。 ・【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編②, モデルの作り方については「知識編」でざっくりと説明しましたが、       (loss='categorical_crossentropy’)を指定する, ・metrics:評価関数を設定する 勾配降下法で算出します。, 勾配とはあるパラメータXnの変化量に対する関数Yの変化量の割合です。 例えば今回の場合では、df.fillna(0)としてあげると欠損値(NaN)を0に変換して埋めてあげることができます。, 今回の場合は順位が1位の場合は1、それ意外は欠損値(NaN)というデータを扱っています。, 1位を予測することが今回の目標なので、1位以外のテストラベルの値は0であった方が学習がしやすいと思い、0で埋めることにしました。, もし、学習させたい要素に欠損値があった場合、学習に支障を来さないために中央値であったり、平均値で補ってあげると良いと思います。, 各要素に欠損値(NaN)があるかを調べます。  構築しています。  one-hot表現とは「目的変数のパターン数」の長さを持ち、 http://www1.mbrace.or.jp/od2/K/pindex.html, http://qiita.com/yai/items/a128727ffdd334a4bc57, you can read useful information later efficiently. それを解消するために、入力データは選手番号の配列(例えば[1000, 1001, 1002, 1003, 1004, 1005]など)を保持しておいて、実際にTensorFlowのsessionを走らせるときにこれをone-hot表現に変換します。具体的なコードはこんな感じです。, input_dataには[1000, 1001, 1002, 1003, 1004, 1005]というような選手番号を6つ持った配列が渡されます。コード中2行目のself.race_results.get_input_length()は選手数を返してくる関数で、この2つの情報をtf.one_hotに渡すことでone-hotベクトルを生成しています。 はじめに GoogleやMicrosoftなどがディープラーニングを使用し… もっと読む; コメントを書く. 過学習を起こさせないために最適なエポックの数で強制終了させる役割を持ちます。, patience:ここで指定したエポック数の間(監視する値に)改善がないと、訓練が停止します。, 詳細はKeras Documentation callbacksを参考にしてください。, model.fit()呼び出しがHistoryオブジェクトを返すことに注目してください。, このメンバーは、訓練中に起きたすべてのことに関するデータを含んでいるディクショナリです。, このディクショナリには、訓練中および検証中に監視される指標ごとに1つ、合計4つのエントリが含まれています。, 図より、過学習も防ぐことができており、損失値もエポックごとに減少していることから良いモデルになっていると思います。, 少し図に偏りがあったりしますが、基本的には80~85%の正解率を出すことができています。, 大学生です。 ③csvのデータを説明変数と目的変数に仕分けする。       1はプログレスバーとして実行ごとにコンソール出力       評価関数はモデルの出力の良し悪しを評価する 説明でした。, ニューラルネットワークの課題やKerasでの解決方法は ・L1正則化:不要なパラメータを削除する際に使用 3行目では6つの異なるone-hotベクトルを1つのベクトルにまとめて、その後の処理のためにfloatにキャストしています。, 以上の実装を使い、バッチサイズは128として30エポック学習を回した際の損失関数の変化は次のようになりました。なにやらものすごくよい感じで学習が進んでいるように見えます。ちなみに、手元のマシンで1時間ほどかかりました。, 次にモデルの精度を評価します。予測は1位~3位の艇番号を出力しているので、その結果が特定の舟券の買い方のもと買ったか負けたかを評価します。たとえば、  (人間でいうと「身長」と「視力」では値の桁が違うため、 (どなたでも一度は「表紙に魚が書かれている本」を見たことはあると思います。), 今回はディープラーニングについての簡単な説明と代表的なフレームワークの1つである ReLUは入力値をX、出力値をYとすると、 こちらの記事は以前投稿した「【機械学習】初心者が競艇予想ツール作成して金儲け … 学習を進めていく中で誤差が減少しない・精度が上昇しないといった これを順伝播(フォワードプロパゲーション)と言います。, ② 出力された予想結果と正解との誤差を損失関数にて算出し、 中身は単純で、それぞれのレースに対して不正解だったら100円マイナス、正解だったら最初頑張ってパースした払戻金をもとにいくら買ったのかを計算して、その合計値を求めています。, 今回はボートレースの1着~3着の艇をを下記の単純なニューラルネットワークで予測しようと試みました。, 結果は、学習データに対してはほぼ100%の精度で予測できたが、テストデータではボロボロ(1位~3位を正確に当てたのは約5%)、バックテストでも赤字という結果でした。        (ディープニューラルネットワーク)ではこの中間層を複数層保有します。, ここからはニューラルネットワークの学習について説明いたします。 Adamは2014年に提唱された比較的新しい最適化アルゴリズムです。 ・y:訓練データの正解の値 Help us understand the problem. inferenceの部分が層をつないでいる部分、lossが損失関数を定義しています。実際の学習はtrainを走らせることで実行されます。, 実装で少し注意した点としては、one-hot表現はnumpyの配列などを使って表現したりせずにtf.one_hotというクラスを使用した点です。 それを出力層から入力層に逆伝播し、各ユニットの重み・バイアスを更新する」 こちらの記事は【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_知識編の続編となります。, 実装編ではKerasを用いて作成したニューラルネットワークについて説明します。 Why not register and get more from Qiita?       2は1エポック毎にコンソール出力 ・ニューラルネットワークを多層化し、データに含まれる特徴をより深く学習する。, この説明の中で出てきたニューラルネットワークがディープラーニングを学ぶ上での基礎となります。, ニューラルネットワークとは生物の神経細胞(ニューロン)が構成するネットワーク(人間の脳内ネットワーク)を元に作成したコンピュータネットワークです。, ユニットはニューロンを元に定義されたものです。 例えば、単勝用の精度評価はaccuracy_winで、複勝の精度はaccuracy_placeで行っています。, 最も単純な単勝の場合だけソースコードを紹介しておきます。ほかの実装も興味がある方は、GitHubのほうを参照してください。, 学習データに対してはほぼ完ぺきな予測をしているが、テストデータに対しては全然だめ、という結果です。, 全然だめとはいっても、単勝や複勝では4割や6割の正解率なので、念のためバックテストを行ってみました。 勾配が0となってしまうことで、学習が進まなくなってしまうという問題です。, こちらは活性化関数にシグモイド関数を指定した際に発生することが多いです。 前章で説明した手順①〜④の順に説明します。, モデルの定義については以下のどちらかの手法で行います。 シグモイド関数は入力値をX、出力値をYとすると、 ディープラーニング(Deep Learning)または深層学習とは、ニューラルネットワークを多層に結合し表現・学習能力を高めた機械学習の手法です。歴史から仕組み、人工知能(AI)、ニューラルネットワークや機械学習との違い、学習方法から活用事例まで基礎から詳しく解説します。  こちらの本を読まれる前にディープラーニングの理論を学んでいただきたいです。       評価関数として使用することが多いのはaccuracy(正解率), コンパイルが完了したのでいよいよモデルの訓練が始まります。 ですのでディープラーニングだけではなく、それ以外の機械学習の手法も学びたい方 github.com. ・verbose:早期終了したことをコンソール出力するべきかを定義する。, ここまでがニューラルネットワークが抱える課題とその解決方法についての  ですので、フレームワークからは見えない内部の計算ロジックなどを基礎から学べます。, ・東京大学のデータサイエンティスト育成講座 層の種類としては大きく3つに分かれます。, ・入力層・・・ニューラルネットワークの入り口です。 この重みの値を自動で調整します。, 例えば、「焼肉を食べに行くべきか」を判定するときに 続いてKerasの簡単な説明をいたします。, Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです。, KerasはTensorFlowまたはCNTK,Theanoなどの機械学習ライブラリの   次の層の全てのユニットの入力になるのが特徴です。  説明変数は予測に使用するデータのこと。 数式で表現すると以下の式になります。, シグモイド関数は微分が扱いやすいという特性があるため、 以下のグラフで表現される関数です。, ReLUは、入力値 > 0の範囲でのみ立ち上がるのが特徴的な関数です。 そちらをご参照いただきたいです。, 開発環境は「【機械学習】初心者が競艇予想ツール作成して金儲け大作戦」と同様に Help us understand the problem. まだこのニューラルネットワークは人並みのようです。, 今回はユニット数などは調整していないので、これらのハイパーパラメータをチューニング 「これからディープラーニングを学びたい!」と考えている方の助けになれば幸いです!, (ちなみに、実際にディープラーニングを使用して競艇予想してみました! 次からは単勝モデルを作成します。, 各層のユニット数や活性化関数・最適化アルゴリズムについてはとりあえず ニューラルネットワークは複雑な表現を行えるようになります。, 活性化関数にはいくつか種類があります。 層を追加するときには、Denseを使用します。, 最終層以外の各層に活性化関数(activation)としてReLU関数を使用しています。, こちらも過学習を防ぐための方法です。        入力層から渡されたデータを中間層のニューロン間で計算し、    ・Units:層のユニット数   こちらは全結合層を表すレイヤークラスです。 実装編の②も投稿いたしました!       0は出力しない  こちらの本はディープラーニングの理論ではなくKerasの使い方を説明していますので、  テストデータ(x_test,y_test)に仕分けする。 ディープラーニングの勉強を始めて1ヶ月。 基礎的なものは理解できた気がしてきたので、何かできないかと考えてみました。 そしてふと、この競艇の順位予想が思いつきました。 順位予想ができるという確信はありませんでしたが、ボートレースのデータのオープンソースが公開されていることがわかり、これはやってみるしかないと思いました。 [:contents] - レース会場 Why not register and get more from Qiita?  (毒キノコ予想を例とすると、説明変数は「キノコの色」や 傾向が見え始めた際に学習を終了することで、過学習を防止します。, EarlyStoppingの引数は以下の通り この学習結果がニューラルネットワークの出来に直結しますので、頑張りましょう!, ニューラルネットワークの学習は以下の手順で進めます。 あるイベントでTensorFlowを触る機会があり、そのとき機械学習で競艇の予想ができないかという話が出て、面白そうなのでやってみました。, Ubuntu 16.04 + python 2.7.12 + TensorFlow 0.7.1, 競艇では6つのボートが順位を競います。舟券を購入する人は選手の戦歴などから、ゴール時点での着順を予想します。 you can read useful information later efficiently. ・loss:損失関数を設定する Kerasで対応いたしました。, ①ではニューラルネットワークの課題と単勝予想のモデル作成について 実装編の記事も投稿いたしました! バイアスの値も自動で調整します。, 重みやバイアスの考え方についてはこちらのサイトを参考とさせていただきました! のディープラーニング編となります。, ディープラーニングは今や書店のIT関連のコーナーに行けば、  それ以外のユニットは0を出力することができる。, ⑥説明変数を標準化する。 しかし、私が説明した内容はニューラルネットワークとKerasのほんの一部でしかありません。, ですので、次の記事では実際にKerasを使用して競艇の予測をした話をしつつ、 # コールバック関数として用意されている早期終了(EarlyStopping)のインポート, '/content/drive/My Drive/model_winner.json', '/content/drive/My Drive/model_winner.h5', 【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_知識編, 【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編②, you can read useful information later efficiently. (adsbygoogle = window.adsbygoogle || []).push({}); kanohkさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog  にオススメです。 Adagradは各パラメータごとに学習率を変化させることで、より効率的に最適化を行います。 出力値と正解との誤差を最小限にすることです。, ・二乗和誤差 今回は、ゴール時点での1着、2着を着順を含め予想する「ニ連単」の予想に挑戦します。, 過去のレース結果は、下記のサイトでテキストファイルで提供されています。  ③モデルをコンパイルする。 使用したデータは【機械学習】初心者が競艇予想ツール作成して金儲け大作戦と同じです。, ですのでまずはGoogle Drive に格納されているcsvの読み込みから行います。, これでGoogle Driveからcsvを取得する準備が整いました。 ⑤目的変数をone-hot表現に変換する。 | でよく使用されます。, ここまでがディープラーニング(どちらかというとニューラルネットワーク)の説明です。        必要なパラメータ(特徴量)を受け取ります。, ・出力層・・・ニューラルネットワークの出口です。 反面0と1の間の状態を表現できないというデメリットもあります。, ・シグモイド関数 ものです。 フレームワークはKerasです。, ディープラーニング(深層学習)とは、人間が自然に行うタスクをコンピュータに学習させる機械学習の手法のひとつです。人工知能(AI)の急速な発展を支える技術であり、その進歩により様々な分野への実用化が進んでいます。, ディープラーニングの技術は、人間の神経細胞(ニューロン)の仕組みを模したシステムであるニューラルネットワークがベースになっています。ニューラルネットワークを多層にして用いることで、データに含まれる特徴を段階的により深く学習することが可能になります。, 上記のサイトにて簡潔かつ端的に説明いただいておりますが、特徴としては以下の通りです。 =>これからディープラーニングを学ぶ方には是非読んでいただきたい一冊です。 - 選手のスタートタイミング分布 言語はPython3 以下のグラフで表現される関数です。, シグモイド関数は、出力値が0と1の間で滑らかに変化する関数です。 初心者が機械学習で競艇予想に挑戦してみた 機械学習 データ分析 ディープラーニング 競艇 More than 1 year has passed since last update. 他の最適化アルゴリズムの良い点を併せ持っているため、 ユニットを削除することで、ネットワークの規模を小さくすることができます。 ボートレースの舟券はネット経由で購入できるので、よさそうなモデルができたら券を即購入できるわけです。, 詳細は後述しますが、ボートレースの1~3位の結果を予測し、その結果に基づいて舟券を買った場合の損益についてバックテストをして実験します。, 私自身、数日前までボートレースの知識は皆無でした。ネットで軽くは調べましたが、現時点でもボートレース公式サイトの解説ページの知識のみです。私は抑えた点は、ボートレースは6艇で行われるという点と、舟券の買い方です。 改善点はいくつかあり、, などが考えられます。モチベーションが続いたらそれらについても試して結果を共有できればと思っています。, (2017/1/1追記) レース場、モーター、ボートの情報も追加して同様の方法で学習させてみましたが、結果は同じような形でした。対象とするレース結果も2016年1年分から2015~2016年の2年分に広げましたが、結果は変わらずでした。。, 今回のソースコードはGitHubで公開しています。raceresults.pyがレース情報のダウンロード・パース部分で、model.pyがtensorflowを使用した実装部分です。 、最初にとりあえずこれを使ってみても良いかもしれません。, これで準備が完了したので、いよいよ訓練(学習)を開始させていきたいと思います。 伝える過程で各層のユニットにて計算を行い、出力層にて予想結果を出力する。 なお前にも述べましたが、今回行ったシミュレーションは現実と異なる条件下で行ったもので、実際のレースでうまくいくかどうかは分かりませんので、あしからず。.       2クラス分類の場合は交差エントロピー(loss='binary_crossentropy)を指定し、        デフォルトは32 対象のレース数が10112レース、購入金額が101万円なので、単勝や複勝で買い続けた場合は購入金額に対して約1割程度負けている計算になります。, 実装はbacktestという関数を参照してください。 テストデータの誤差の減少・精度の上昇は途中で終了してしまいます。, 過学習を防ぐ方法としては以下の手法などがあります。 ただし、学習の初期に勾配が大きいとすぐに更新量が小さくなってしまい、 数式で表現すると以下の式になります。, ReLUはシンプルかつ層(レイヤー)の数が多くなっても安定した学習が では取得しましょう。, ①Google Driveに接続し、対象のファイルを選択し、右クリック→共有 と選択, これでcsvの読み込みは完了しましたので、まずは単勝予想のモデルを作成していきます!, 処理内容は以下の通りです。 誤差Eが最小値となるように重さWjkを更新できます! 過去の更新量を一定の確率で忘却することにより、Adagradの =>こちらは機械学習の各手法を学べる本です。 Google Colaboratoryを使用しています。  該当するもののみ1が設定され、それ以外の値は0となるベクトルに変換すること。, one-hot表現にすると、出力層のユニット数を「目的変数のパターン数」で設定し、 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. ここではよく聞く3種類の活性化関数をご紹介します。, ・ステップ関数 試しにサイトにアクセスしてデータをダウンロードすると分かりますが、結果はテキストファイルで保存されています。なのでそれを気合でパースします。, また、今回の記事では、2016年1月1日~2016年12月27日までのレース結果(約5万レース)を4:1に分割してそれぞれ学習データとテストデータとして使用します。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away.            (何種類の特徴があるのか、訓練に使用するデータはいくつか) はじめに.   「キノコのカサの大きさ」など) 選手番号を使うことも考えましたが、それぞれを別カテゴリとしてしまうと、無駄な情報量が多くなってしまうので省くことにします。, 年齢、体重などが成績に関わるか、と言われると競艇の知識がないのでそれはわかりませんが、一応特徴量として入れることにしました。, KerasはGoogleの社員が開発設計したもので、Google開発のTensorflowとの互換性がいいのでとても使いやすいです。, さらにKerasは高校の数学ができればある程度開発を行うことができる(と設計者が言っていた)のでとっかかりやすいとおもいました。, files.upload()で自分のPC内にあるファイルをインストールすることができます。, 指定した行(axis=0)または列(axis=1)の要素を削除することができます。 競艇の平均回収率が75%であることを踏まえれば、そこそこの結果と言えそうです。, 競艇は人対人のレースであるため、イレギュラーな要素が多く、機械学習で着順結果そのものを予想することは難しいようです。そもそも筆者が機械学習や競艇に対して素人であるということも一つの原因ですが.. また、実装編は長くなりそうなので①前編と②後編の豪華?二本立てでお送りいたします!, --2019/9/9追記-- ステップ関数は入力値をX、出力値をYとすると、            input_shapeは入力層のみ設定する      例えば10を設定した場合は、訓練データ全ての実行を10回行う, これでモデルの作成・訓練は完了です。 以下の書籍を参考にいたしました。 必ず本が置いてあるくらいメジャーなものになりつつあります。 « 金融データのPythonでの扱い方 TensorFlowでword2vecを使って単語ベクト… ». 競艇は人対人のレースであるため、イレギュラーな要素が多く、機械学習で着順結果そのものを予想することは難しいようです。そもそも筆者が機械学習や競艇に対して素人であるということも一つの原因ですが.. 大量のレースから選手間に圧倒的な力量差がある、いわゆる「固いレース」を抽  フレームワークを使わずにニューラルネットワークやディープニューラルネットワークを モデルの性能を測るためのテストデータを用意します。, モデルの学習がうまくいき、過学習を起こしていない場合は ④説明変数と目的変数をそれぞれ訓練データ(x_train,y_train)と =>こちらはKerasの開発者が作られた本です。 結論からいうと、今回は非常に単純なモデルを使い、訓練データに対しては完璧な精度を出したのですがテストデータに対してはどのような賭け方をしても赤字、というような結果になっています。, ボートレースのレース結果をニューラルネットを使って予測して小遣いを稼ぐ! まず、選手一人は選手番号をone-hot表現で保持したベクトルで保持します。1レース6艇なので、そのベクトルを6選手分つなげたベクトルが入力のベクトルとなります。 Python, Numpy, Pandas, Machine Learning, Deep Learning, TensorFlow, Keras, ResNet, ConvNet, Object detection, YOLO, Face Recognition. AI(人工知能)は、近年、さまざまな分野において技術革新として、急速に導入が進められています。株式会社アイ・ティー・アールの調査によると、2018年度のAI主要6市場の売上金額は199億5,000万円、前年度比53.5%増と大幅に増加しました。またそれ以降も順調な増加が見込まれ、2023年度は640億円になると予想されています。この発展を支える技術が「ディープラーニング(英: Deep learning)」または「深層学習(しんそうがくしゅう)」です。本稿では、東京大学大学院情報理工学系研究科の山崎俊彦准教授にお話を伺い、その活用事例から仕組みまで詳しく解説します。, ディープラーニング(Deep Learning)とは、ニューラルネットワークを多層に結合して表現・学習能力を高めた機械学習の一手法です。, 単純に多層にするだけでは、表現力不足や過学習などの問題がありましたが、Dropout法やReLUなど、数々の工夫とビッグデータの助けにより解決されました。, 現在は、AIにおける3回目のブームと言われています。この3回目のブームのブレイクスルーとなった技術がディープラーニング(Deep Learning)です。, 2012年、世界的な画像認識コンペティション「ILSVRC」において、東京大学やオックスフォード大学など名だたる研究機関を抑え、トロント大学が開発した「Super Vision」が圧倒的な精度で勝利を飾り、人工知能研究界に激震を与えました。, トロント大学のジェフリー・ヒントン教授らが開発した「**オートエンコーダ」という技術により、ニューラルネットワーク自身で特徴を捉えることが可能に。「Super Vision」にも用いられた、この*多層ニューラルネットワークを用いた学習方法を「ディープラーニング」と呼ぶようになりました。, *「入力層」「隠れ層(中間層)」「出力層」で構成されるニューラルネットワーク**ニューラルネットワークの出力層の値が入力層と同じになるように、重みのパラメータを調整する手法, 「機械学習」は、「ディープラーニング(深層学習)」とあわせて耳にすることが多い単語です。混同されたり誤解されやすい、これらの違いについて、そしてそもそも人工知能AIとはなにか解説します。, 人工知能(AI…Artificial Intelligence)とは、辞書には「学習・推論・判断といった人間の知能のもつ機能を備えたコンピューターシステム」と記されています。(大辞林 第三版より抜粋), しかし、学術的な視点では「人工知能(AI)」という言葉は多義的であり、人によってその捉え方は異なります。人工知能の定義は、専門家の間でも明確に定まっていないのが現状です。詳しくは下記の記事をご覧ください。, 機械学習とは、コンピューターが大量のデータを学習し、分類や予測などのタスクを遂行するアルゴリズムやモデルを自動的に構築する技術です。, AIを機能させる技術・アルゴリズムとして、ニューラルネットワーク以外にも「ニアレストネイバー法」、「決定木」、「サポートベクターマシン」など、さまざまな技術が存在します。, ディープラーニング(Deep Learning)と機械学習の違いは、特徴量を「機械が自動で学習するか」、「人間が手動で入力するか」という点です。, そのため機械学習は、限定的かつ構造化されたデータが利用可能な場合に用いられることが多いです。一方ディープラーニングは、複雑な非構造データを用いる際に利用されることが多く、「音声認識」「画像認識」「自然言語処理」などの分野に適用されています。, ディープラーニングは、どのような構造で動いているのでしょうか。ここでは、機械学習を機能させるための一手法で、ディープラーニングの枠組みであるニューラルネットワークの仕組みを解説します。, まず、入力層にデータを入力し、そのデータを認識をするための指標である*特徴量 を入力します。その入力に対し、神経細胞間の接続強度に相当する重み w1 w2‥を掛けたものを、出力層のニューロンに入力します。, 出力層のニューロンは、この入力を足し合わせたものを**活性化関数に通し、最終的な結果を出力します。この入力から出力までの一連の流れを「パーセプトロン」と呼びます。ニューラルネットワークは、このパーセプトロンを複数組み合わせることにより構成されています。, *学習データにどのような特徴があるかを数値化したもの**ニューラルネットワークにおいて、線形変換をした後に適用する、非線形関数もしくは恒等関数, ディープラーニング(Deep Learning)は、ニューラルネットワークの中間層を複数にすることで、特徴量をコンピューターが判断します。, 現在、活発に研究が進められているディープラーニング(Deep Learning)の学習方法について、「Pre-train & Fine-tune」「マルチモーダル学習」のふたつをご紹介します。, 「Pre-train & Fine-tune」は、事前に一般の画像情報を学習させ、それを専門分野の画像に転移して学習させることで、高度な解析を可能にする学習方法です。, 「マルチモーダル学習」とは、複数の種類のデータを使ってAIが学習する仕組みのことです。, つまり、画像、音声、テキストを、個別・全体両方で学習させる方法です。ディープラーニングは認識精度が高くなっただけでなく、画像や音声、言語といったこれまでの分野間の垣根を取っ払い、自由に行き来することを可能にしたことも大きな貢献だと思います」, ほかの多くの機械学習アルゴリズムがデータをすべて使って一気に学習しなくてはならないバッチ学習であるのに対し、ニューラルネットワークは、途中で学習を止めたりデータを変えたりアーキテクチャを変えたりしながら逐次学習させる事が可能です。これが、より多くの応用先を生み出しています。, たとえば、偽札を作る際の、偽札を作ろうとする犯人とそれを見破る警察や銀行員が、互いに切磋琢磨するさまを想像してみるとわかりやすいでしょう。偽物生成のニューラルネットワークは、最初はうまく作れませんが、だんだん工夫を凝らすことにより精度が上がります。, 本物を見分けるニューラルネットワークも、偽物生成のニューラルネットワークの成果物を常に見ているので見分ける精度を上げていきます。最終的に、偽物を見分けられず通ったものが、GANにより生成されます」, *あるデータが付随して持つ、そのデータ自身についての付加的なデータ 例)業種、CMの打ち方 など, 画像認識、音声認識、自然言語処理、予測、映像解析、異常検知など、ディープラーニング(Deep Learning)は様々な技術分野に応用されています。以下では、実用化した事例を紹介していきます。Photo by Gerd Altmann on Pixabay, 「OOH AI」は、特大サイズの画像素材をAIで生成するサービスです。ディープラーニングを用いることで、数十万pxサイズまで高解像度化でき、写真やイラストを元画像の縦4倍、横4倍に高解像度化することが可能です。主に屋外広告、交通広告に利用したい広告素材向けとなっており、早く、低コストでクオリティーの高いOOH用の画像を制作できます。, Google HomeはGoogle社が製造販売しているAIスピーカーです。AIスピーカーとは、話し手の命令を音声認識により抽出して自然言語処理によって指示を理解し実行する機能を有するスピーカーです。Google Homeはハンズフリーで調べ物や翻訳など、生活の手助けになる機能が搭載されています。その他にも、音楽の再生やゲームアプリなど様々なエンターテイメントを楽しむことができます。, インフルエンザ予報は、全国各地のインフルエンザの流行度合いを予測し、可視化できるサービスです。インフルエンザ新規患者数のデータをもとに、ディープラーニングを用いた予測アルゴリズムを使用。地域ごとに今週〜4週間後までの流行期間を予測できるほか、流行度合いもレベル0〜3に分けて把握できるため、インフルエンザの予防に役立てることができます。, 「People Counter Pro」は、キヤノンが発売する、ディープラーニング(深層学習)を用いて、ネットワークカメラで撮影した映像から、数千人規模の群衆人数をリアルタイムにカウントする映像解析技術を搭載した映像解析ソフトウェアです。映像から人の頭部を検出することで、人が密集している状況でも人数をカウントでき、また、指定した領域のなかにいる人数の表示や、推移のグラフ表示も可能です。そのため、混雑状況の把握や分析に活用できます。, 様々な方法でディープラーニングを学ぶことができます。ここでは独学で学ぶ方法として、オススメの書籍、G検定について紹介します。, 初心者でもわかりやすい入門書ですが、情報量が多く、ある程度のカバー範囲を持っています。流れを持って説明されているので、読みやすく、とっつきやすいです。人気が高く、ディープラーニングを知るためにオススメの1冊です。, AI・ディープラーニングのビジネス展開についての実践的な書籍です。AI、ディープラーニングの導入について詳しく書かれています。また、ディープラーニングの基礎についても詳しく書かれており、入門書としても利用できます。, ある程度ディープラーニングの基礎を理解したうえで、自分でディープラーニングを構築してみたいという方向けの書籍です。「日本ディープラーニング協会G検定合格者が選ぶディープラーニング関連おすすめ書籍ランキング」で1位なった、評価の高い1冊です。, ディープラーニングのスキルを習得するためのアクションとして、G検定(ジェネラリスト検定)獲得を通じ、ディープラーニングの知識を身につける所から始めてみるのもいいでしょう。, G検定(とは、一般社団法人日本ディープラーニング協会(英称:Japan Deep Learninng Association、以下JDLA)が実施している資格試験です。ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているか検定します。G検定取得によってディープラーニングの知識が身につくでしょう。, ディープラーニングは、AIの革新的技術として、現在の3回目のAIブームのブレイクスルーとなりました。では、今後AIがより発展していくために、これから解決すべきディープラーニングの課題とは何でしょうか。, たとえばホテルで流行っている*ダイナミックプライシングを例にしましょう。現在の価格指標は、季節・天候などよりもホテルの近くでジャニーズのライブや大きな学会が開催されるなど、AIと関係がないものの影響が強いんです。つまり、これらをAIが理解するためには、ジャニーズがどういう集団で、彼らが来るとファンが何万人単位で動く、という一般常識を理解しなくてはなりません。, 現在、AIには、このような一般常識や共通概念が存在しません。一般常識を、機械にどう自立的に学習させるかが、これから重要になると思います。また、ジャニーズのコンサートが来るという情報も自律的にどう獲得してくるかも重要です」, *ダイナミックプライシング……同一の商品やサービスの価格を需要と供給の状況に合わせて変動させる価格戦略。, 慶應大学法律学部政治学科に在学中。大学では政治学を専攻し、確かな実力とストイックさでLedge.aiの発展に貢献。大学ではアカペラサークルに所属し、無類の映画好きでもある。, 「『接客DX』でおもてなし革命をおこす!」チャットコマース“ジールス”の限界と進化, 「新たなオンライン接客のあり方を発明」HISとZeals、実店舗での“接客”をデジタル上で再現, 【ウェブセミナー開催】滋賀大学、ドコモ・インサイトマーケティング、日本HPが登壇。『産学連携のデータ活用プロジェクトから見る、データサイエンスの課題と解決策』, 【ウェブセミナー開催】ISP、日本HPが登壇。『AI開発まるわかり!開発現場の悲鳴とソリューション』, 日本HPが提唱するエッジAIの有用性「データサイエンティストが妥協せず最高精度のモデルを作れる」, 独自アルゴリズムのAIを使った超高速、高精度、小規模な「リアルタイム3次元予測技術」を開発, AIスピーカー(スマートスピーカー)とは | 仕組み・機能・選び方・おすすめ14選, 数千人を瞬時にカウントできる技術搭載の映像解析ソフトウェア「People Counter Pro」, 関連記事:G検定(ジェネラリスト検定)とは | 難易度・出題範囲・参考書、問題集・合格体験記まで, 関連記事:【ディープラーニング講座8選】E資格とは?受験のために必要なJDLA認定プログラムを解説. 未知のデータに対して予想を行うことを目的としています。, ですが、この学習を行うにあたり、様々な問題が発生します。  学べるため、一度読んで損はないはずです!, ・PythonとKerasによるディープラーニング     損失関数の選び方は以下の2通り 最後に作成したモデルを使用して予想を行います。 以下は代表的な問題です。, 「知識編」にて「ニューラルネットワークは出力値と正解との誤差を算出し、 自信があるレースだけに絞る感じです。, 的中率は4割以上になり、収支も6か月中5か月で微妙ですがプラスとなっています。 ディープラーニング(深層学習)とは? 「ディープラーニング」を取り入れることで、人間が無意識的に判断している ”特徴” をコンピューターも自ら見いだすことができるようになるわけですが、どうやってその特徴を抽出するのでしょうか。 どれが最も効果があるかはニューラルネットワークごとに異なります。, 以下は最適化アルゴリズムの簡単な説明とKerasでの実装方法をご紹介します。 とてもわかりやすく説明されているため、ぜひご参照ください。, 上記のバイアスの説明でも記載いたしましたが、 という欠点を克服しています。, ・Adam 今回はそれに加えてニューラルネットワークが抱える課題についても はじめに. 対策としては活性化関数をシグモイド関数からReLUに変更することです。, 過学習とはモデルを学習する際に使用した訓練データに対してのみ最適化が進み、 ・正則化を行う こちらは以下の式で求められます。, 勾配降下法は勾配を元にYの最小値に向かって降下するように - 選手の枠別着順分布 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. ・【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編① 順位予想ができるという確信はありませんでしたが、ボートレースのデータのオープンソースが公開されていることがわかり、これはやってみるしかないと思いました。, 選手のデータから勝率まで細かく載っているので学習させるにはちょうどいい情報量だと思います。, とりあえずこの情報量で学習させていきます。 と考える人が多かった場合、ユニットは「友人の予定」という入力を重要視します。, また、ニューラルネットワークのユニットは学習を進めることで、  ④訓練データを使用してモデルの訓練を行う。, ここからはKerasの使い方を説明いたします。 「知識編」でご紹介した本ですが、本当にオススメですので是非ご参照ください。 最適化アルゴリズムの選択が重要となります。, 最適化アルゴリズムも複数種あります。        ディープラーニングで使用するニューラルネットワーク お試しで設定しています。, 私の友人曰く「競艇の単勝予想の正答率7割は普通」とのことでしたので、   主な引数は以下の通り こちらの記事は以前投稿した「【機械学習】初心者が競艇予想ツール作成して金儲け大作戦」 参考までに、汚いコードですが私の書いたものはこちらです。, 今回はまずは非常にシンプルなモデルを試します。 パラメータXnを変化させる手法です。. 可能であるため、最近のディープラーニングではよく使用されています。, ニューラルネットワークの層(レイヤー)はユニットをまとめたものです。 各ユニットは入力を受け取り、計算した結果を出力する仕組みとなっています。, 上の画像ですと、ユニットに向かって矢印が3本伸びています。 こうすることで過学習を抑制できると考えられています。, 正則化は重みに制限を加え、重みが極端な値を設定し局所最適解を導かないようにします。, Kerasでは以下の2種類の正則化が行えます。 ②csvの全データから訓練データに使用するレコード数を計算する。 2014年~現在(2016/11)までの結果を一括で取得し、Python+SQLite3でデータベース化しました。, 訓練を行う際に入力する特徴量を計算しました。使用する特徴量は以下の通りとしました。 http://www1.mbrace.or.jp/od2/K/pindex.html       平均二乗誤差(loss='mean_squared_error')を指定する, 2.分類問題を解くためのニューラルネットワークの場合 ・ニューラルネットワークをベースとしている。      1.回帰問題を解くためのニューラルネットワークの場合     損失関数はモデルの出力と正解との誤差がどれだけあるのか(勾配)を定義する。 と説明いたしました。, 誤差を元に各ユニットの重み・バイアスの更新を行う際、その更新量は 予測が1-3-2の順で、実際の結果が1-3-4の場合は、「単勝、複勝、2連単、2連複、拡連複」の場合は正解ですが、「3連単、3連複」の場合は不正解、といった感じです。 ディープラーニングにおいて、変数型をそろえるのは重要な部分となってきます。, OneHotEncodingしたので、Rankカラム(列)自体は必要なくなったので、削除します。, DataFrameを結合することができます。 上位APIとしてつくられました。, Kerasを使うことで、以下の手順で簡単にニューラルネットワークを作成できます。 ご説明いたします。, ニューラルネットワークでは様々なデータを元に学習し、 ・keras.models.Sequentiaクラスを使用する それぞれの舟券の買い方でテストデータの対象レースの舟券をすべて100円で買った場合の損益がこちらになります。…全敗ですね。 Help us understand the problem. 【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編①, 【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編②, you can read useful information later efficiently. その他引数の設定によって細かく結合方法を指定することができます。, DataFrame.ilocからアクセスすれば、行と列の数字(インデックス番号)からDataFrameを取り出せます。, test_size=0.2とすると、全体のデータの20%をテストデータとして使用する。という意味になります。, X_train(訓練データ)とy_train(テストデータ)の両方を正規化しておきます。, ここからニューラルネットワークを構築していきます。 確立的勾配降下法は学習時にパラメータを更新するたびに、訓練データを切り替えます。 損失関数は、1~3位のそれぞれの予想に対してクロスエントロピーを計算し、その和を損失としました。, 入力と出力をつなぐ隠れ層は1層で隠れ層の数は1000個とました。今回は隠れ層の数の調整は行っていないので、これが適切な数かはよくわかりません。, 以上のモデルをTensorFlowで実装しました。ソースコードはこちらにアップしてあります。 Why not register and get more from Qiita? 以下のグラフで表現される関数です。, グラフどおり、出力値を0か1で表現する非常にシンプルな関数です。 ・PythonとKerasによるディープラーニング, それでは実際に競艇の予想モデルを作成していきます。 ・patience:正答率がどれくらいのepoch数で改善が見られなかった際に ・【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_実装編②, この記事は「ディープラーニングって何かよくわからないけど、とりあえず競艇予想してお金儲けしたい!」と考えたド素人が学んだ知識をアウトプットするための記事でございます。, 詳しいディープラーニングの理論につきましてはこの記事の最後に参考文献をご紹介いたしますので、  今回は全データの8割を訓練データ、2割をテストデータとする。 これを逆伝播(バックプロパゲーション)と言います。, ③ ①と②を繰り返し実施し、出力値と正解との誤差を小さくし、        ニューラルネットワークで予想した結果を出力します。, ・中間層・・・入力層と出力層をつなぐ層です。 また、真の最適解のことを大域最適解と言います。, 局所最適解を避けて大域最適解にたどり着くためには 各層のユニットの重み・バイアスを更新する。    ・activation:使用する活性化関数を設定する。, モデルへの層追加が完了した後に、モデルのコンパイルをcompileメソッドで実施します。, compileメソッドの引数は以下の通り       多クラス分類(Kクラス)の場合は多クラス交差エントロピー 以下の式で表現されます。, 二乗和誤差は回帰問題(例えば 過去の日経平均株価などを元に翌日の株価を予想する など) プロフィール id:kanohk はてなブログPro. やはりオッズが低いレースしか的中していないようですが、的中率の高さでカバーしている感じです。 Why not register and get more from Qiita? この値を局所最適解と言います。 ・早期終了を行う, ドロップアウトは出力層以外のユニットをある一定の確率で消去する仕組みです。 ユニットでは以下の値を活性化関数を用いて変換します。, 活性化関数を入力情報の総和に対して使用し、出力信号に変換することで 参考となった書籍をご紹介させていただきます。, ・はじめてのディープラーニング 大量のレースから選手間に圧倒的な力量差がある、いわゆる「固いレース」を抽出する用途には使えるかもしれません。  目的変数は予測したいデータのこと。 Kerasの使い方をご紹介します。, 実際に手を動かしてみると、意外と簡単にディープラーニングの構築ができますので、この記事が  標準化により説明変数ごとの値の桁のばらつきを統一化できます。  しかし、Kerasの開発者ですので、Kerasの使い方についてはとてもわかりやすいです。.  (毒キノコ予想を例とすると、目的変数は「毒の有無」) このような感じで、舟券の買い方ごとに精度を算出します。, そのため、ソースコードにはaccuracy_*という形の関数がたくさん定義してあります。 - 選手の決まり手分布 つまりは上記のような曲線の形はわかりません。, この場合は勾配を降下していくと局所的な最小の誤差Eにたどり着いてしまいます。 選手の特徴量については、過去1か月半を対象として作成しました。なお、戦歴が極端に少ない選手が出場しているレースは、予想対象から外しています。選手が使用するボート・モーターも予想の参考にする方がいるようですが、今回は対象外としました。, ネットワークの実装は以下の記事を参考に行いました。 [機械学習(TensorFlow)+ ロト6] http://qiita.com/yai/items/a128727ffdd334a4bc57, 訓練は2014年1月~2016年3月の97200レースを対象として行い、ステップ数は300としました。 訓練をするときには、fit()を使用します。, validation_split:検証用データを作成することができる。(今回の場合は0.2なので20%を検証データとして使う。), callbacks:色々な種類があり、今回は過学習が起こる前に学習を強制終了させるEarlyStoppingを使用しています。, callbacks.EarlyStopping(monitor='', patience=10) ニューラルネットワークが抱える課題やそれを解決するためのKerasの使い方をご紹介する予定です。, 最後に、今回私がディープラーニング・Kerasを学んだ際に 予想はpredictメソッドを使用します。, ニューラルネットワークの説明とKerasの使い方について説明させていただきました。 - 進入固定か否か マイナスしたものです。, こちらは分類問題(例えば キノコの色などを元に毒キノコか無毒キノコかを判別する など) 読者です 読者をやめる 読者になる 読者になる.  ②定義したモデルに入力層・中間層(隠れ層)・出力層 などの層(レイヤー)を追加する。 数式で表現すると以下の式になります。, シンプルな点がメリットではありますが、 ランダムに層の出力を0にして隠すことによって学習の偏りを防ぎ、より有益な学習を行うことができるようになります。, optimizer:与えられたデータと損失関数に基づいてネットワークが自身を更新するメカニズム, loss:損失関数:訓練データでのネットワークの性能をどのように評価するのか、そしてネットワークを正しい方向にどのように向わせるのかを決める方法, オプティマイザのrmspropに関してはどの問題でも基本的にちゃんと動いてくれる有能な役割をもつので Rankは名義特徴量であるため、OneHotEncodingで情報を有益に使うようにする必要があります。, DataFrameの変数型を変更することができます。 ちょっと長くて読みにくいソースコードですが、極力以前と同様にinference, loss, trainingの3部分に分割して書くようにしています。 その誤差を出力層から入力層に逆に伝えていき、  標準化とはデータの平均を0、標準偏差を1に変換することです。 訓練データ・テストデータ共に予測の精度が同じように向上していきます。, しかし、過学習が発生した場合は訓練データは順調に誤差が減少し、精度が上昇しますが 検索 広告.   上述のニューラルネットワークのように各ユニットの出力が        ニューラルネットワークで予想するために RMSpropはAdagradを改良したものです。 こうすることで局所最適解に陥りにくくなります。, ・Adagrad しかし、勾配降下法を行う際は「重さ・バイアスによる誤差の変化」 勾配降下法により重さWjkと誤差Eから重さの勾配を算出し、 Python DeepLearning ニューラルネットワーク Keras. 古くからニューラルネットワークで使用されていました。, ・ReLU   このまま使用すると「身長」の値が大きく影響する可能性がある)  予測した分類に該当するユニットのみ1を出力し、 そしてsum()によって加算することで、各要素にどれだけの欠損値(NaN)があるかがわかります。, OneHotEncodingを簡単に行うことができます。 What is going on with this article? ・verbose:訓練中の過程をコンソール出力するかを設定 すれば伸びるかもしれません。, 今回はニューラルネットワークが抱える課題と競艇の単勝予想モデルの作成について こちらの記事は【ディープラーニング】初心者が競艇予想ツールを作成するために学んだディープラーニングについて_知識編の続編となります。. ボートレースでは、次のような券の買い方があるようです。, 他にもながしやボックスという買い方もあるようですが、今回はこの2つの買い方は無視してモデルの評価を行います。, 要するに、ボートレースは6艇で行われる競技で、そのうち上位3位に入る艇をうまく予想できれば儲かりそう、という点が大事です。, 公式サイトで様々なデータが公開されていますが、今回はその中でもレースの成績をダウンロードして使用します。 最初は入力をnumpy.zerosなどを使って自分で作っていたのですが、この場合1万個近い要素を持つ配列を保持するため、メモリが結構かつかつになります。というか、私の手元のPCだと1年分~2年分のデータに対して走らせただけでメモリ不足で学習が落ちるという状況でした。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 結果として、訓練データにおける的中率は20%程度になりました。やはり競艇の予想は難しいようです。, 2016年5月~2016年10月の6か月間のレースを対象としてテストを行いました。各レースにおいて、出力ラベル(=予想結果)の値が一番高くなったものを、100円ずつ買ったとしてシミュレーションを行います。 ①Google Driveより読み込んだcsvをPandasオブジェクトとして格納する。

Hp パソコン キーボードカバー, Qgis エンコーディング 変更できない, アクアリウム ダイニング 碧 口コミ, 18歳 誕生日プレゼント 娘, ニューヨーク 吉本 Youtube, なごみ の 米屋 和菓子 教室, Windows ムービーメーカー 結婚式,

カテゴリー:

2020年12月4日