情報理論Araboza


情報理論とは何ですか。


抽象情報という概念を定量化し,情報の格納と通信を研究する分野である.

1.情報量


情報を定量的に表す3つの条件 発生する可能性の高いイベントは情報量が低いことに等しく,必然的に発生するイベントには情報がない. (例)999個の青いボールと1個の赤いボールのポケットがあると仮定し,ボールごとに1個ずつ引くと,最初に引いた青いボールは情報量が高いが,情報量が徐々に低下し,青いボールを引く確率が1に近づくほど意味が大きい.しかし、真ん中に赤いボールを引くと、情報量の高いイベントで、青いボールの数が多いほど(赤いボールを吸う確率が低いほど)、赤いボールを吸うイベントの情報量が高くなります。 発生する可能性の低いイベントは情報量が多い。 2つの独立したイベントがある場合、情報量全体は1つの情報量を追加することに等しい。

イベントxxxが発生する確率をP(X=x)P(X=x)P(X=x)P(X=x)と呼ぶと、イベントの情報量(Information Content)は、I(x)=\logbP(x)=-logbP(x)I(x)=87 logbP(x)と定義される.
💡Tip bbbは主に2,eee(自然ログ)および10と同じ値を用い,b=2 b=2 b=2 b=2 b=2の場合,情報量は情報を表すのに必要なビット数に等しい.
以下の図は、b=eb=eb=eの場合のP(x)P(x)P(x)P(x)値のlogP(x)-logP(x)\logP(x)の図である.

青球nnn個と赤球1個を計算する際の赤球イベント情報量のコード 赤球がレバーに引き抜かれるまでシミュレーションを繰り返す回数が多ければ多いほど、1つの赤球が引き抜かれる確率が小さくなり、平均統計の情報量が大きくなります。 import numpy as np import math import random ポケットの中のボールの数。数字を変えてみましょう。 total = 1000 #---------------# count=1#実験終了前に取り出した球数 1からtotalまでの整数から1つ抽出し,totalに等しい場合は実験終了 #total=1000は1~999を表します:blue/1000:red while True: sample = random.randrange(1,total+1) if sample == total: break count += 1 print('number of blue samples: '+str(count-1)) print('information content: '+str(-math.log(1/count)))

📄Output

2. Entropy


情報量がイベントの値である場合、特定の確率に従って分布するイベントの情報量の世代価値をEntropyと呼ぶ.

Entropyは離散確率変数XXXはx 1,x 2,...,xnx_1, x_2, ..., x_nx1​,x2​,...,xnに1つの値があると仮定し、それぞれの場合、確率に所有する情報量を乗じ、それをすべて1つの値を乗じた形式で表すと、上記の式が得られる.
For Discrete Random Variables 上図は、様々な色のボールが入ったポケットからボールを取り出す際に、各ボールのエントロピー値を計算する例です。上ポケットには4色のボールがあり、特定の色のボールが抜かれる確率はそれぞれ0.4、0.3、0.2、0.1で、Entropyは約1.28です。 下ポケットには青いボールしか入っていないので、青いボールが抜かれる確率は1なのでentropyは0(=∮1 log 1)0(=-1 log 1)0(=∮1 log 1)です。 各色の球がある場合(全球の色が異なる)Entropyが高く(約2.32.3.3)、同じ色の球が多い場合(全球の色が同じ)Entropyが最も低い(000)。 上図はコイン投げ後に正面に現れる確率のEntropyを示していますが、正面に現れる確率と裏面に現れる確率は0.50.50.5なので予測が難しく、数値が最大になる様子が見られます。

3. Kullback Leibler Divergence


機械学習の目標は,モデルの確率分布をデータの実際の確率分布に近づけ,新しい入力データもよく予測できるようにすることである.機械学習モデルには大きく2つあります.1つは決定モデルで、データの実際の分布をモデリングせず、決定境界だけを学習します.たとえば、モデルの結果値が0より小さい場合、データは1番クラスに分類され、0より大きい場合、データは2番クラスに分類されます.もう1つのモデルはモデルを生成することです.生成モデルは,データとモデルから導出した種々の確率分布と基礎理論を用いて,データの実際の分布を間接的にモデリングした.したがって,生成モデルを学習するには,Kullback Leibler Divergenceを代表する2つの確率分布の違いを反映する指標が必要である.
データの実際確率分布はP(x)P(x)P(x)P(x)P(x) Q(x)Q(x)Q(x)Q(x)

2つの確率分布のKullback Leibler Divergenceは、P(x)P(x)P(x)P(x)Q(x)Q(x)Q(x)Q(x)Q(x)Q(x)に基づく平均情報量と、P(x)P(x)P(x)P(x)に基づく平均情報量との差として定義することができる.

💡Tip連続確率変数の場合:

2つの確率分布の差の値であるため、距離関数と似た性質を持つが、その距離関数式には標準確率分布としての確率分布が存在するため、DKL(P\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Kullback Leibler Divergenceの特性 DKL(P∣∣Q)≥0D_{KL}(P∣∣Q) ≥ 0DKL​(P∣∣Q)≥0 DKL(P∣∣Q)=0D_{KL}(P∣∣Q) = 0DKL​(P∣∣Q)=0 if and olny if P=QP = QP=Q non-symmetric : DKL(P∣∣Q)≠DKL(Q∣∣P)D_{KL}(P∣∣Q) ≠ D_{KL}(Q∣∣P)DKL​(P∣∣Q)​=DKL​(Q∣∣P)

4. Cross Entropy Loss


機械学習では,モデルが表す確率分布とデータが従う実際の確率分布との差を表す関数を損失関数と呼ぶ.モデルの確率分布はパラメータによって変化するので,損失関数もパラメータによって決定される.
データが連続値を持つ回帰問題とは異なり,離散値を持つ分類問題ではモデルの出力結果を線形関数で表す.2つのクラスのgestic関数をnnnクラスに拡張する場合,深さ学習にも刺繍のSoftmax Functionを用いた.また,CrossEntropy Lossも損失関数の一種であり,以下のように表すことができる.

分類問題では,データのラベルはOne-Hot Encodeで表される.クラスのタイプがNNNであり、いくつかのデータがNNNの第2のクラスに属する場合、NNNの第2の要素のみが1であり、残りは000で満たされたNNN次元ベクトルである.
入力データの特徴値がモデルを通過すると、出力層のSoftmax Functionは各クラスに属する確率を計算し、これらの確率値はモデル推定の確率分布Q(x)Q(x)Q(x)Q(x)Q(x)Q(x)Q(x)Q(x)Q(x)を構成する.3つのクライアントc 1、c 2、c 3 c 1、c 2、c 3 c 1、c 2、c 3 3のフローしない問題において、一部のデータの出力値は以下のように仮定される.

この結果は次の式を表す.

データが実際に第2クラスに属している場合、データの実際の確率分布はOne-Hot Encodeと同じ[0,1,0][0,1,0][0,1,0]であり、データが第2クラスに含まれている事実が明確に分かれているため、確率分布は以下のように計算される.

これはCross Engropyで計算できる.

分類問題では,データの確率分布が1つの熱領域ベクトルとして表現されるため,P(x)P(x)P(x)P(x)Q(x)Q(x)Q(x)分布をランダムに生成すると,P(x)P(x)P(x)P(x)P(x)P(x)P(x)P(x))を変えることでCrossエントロピーを計算できる.
Cross Entropyパスワード import numpy as np import random # generate random output #-----------------# # can be modified class_num = 4 #-----------------# q_vector = [] total = 1 for i in range(class_num-1): q = random.uniform(0,total) q_vector.append(round(q,3)) total = total - q q_vector.append(total) softmax_output = np.array(q_vector) print(softmax_output) #-----------------# # can be modified class_index = 1 #-----------------# p_vector = np.zeros(class_num) p_vector[class_index-1] = 1 cross_entropy = -np.sum(np.multiply(p_vector, np.log(softmax_output))) print('model prediction: '+str(softmax_output)) print('data label: '+str(p_vector)) print('cross entropy: '+str(round(cross_entropy,4)))

📄Output