Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

「深層学習」の省略された数式を自分で確認しました

深層学習を最初から読み始めたのですが、省略してある数式の部分がよく分からなかったので、自分で計算して確認しました。

二値分類のロジスティック関数と微分、尤度、誤差関数と微分

1.1 ロジスティック関数(Sigmoid関数)
y= f\left(u\right)=\frac{1}{1+e^{-u}} (2.3.1)

1.2 ロジスティック関数の微分(uで微分した結果)
\frac{\partial f\left(u\right)}{\partial u}=f\left(u\right)\left(1-f\left(u\right)\right)=y\left(1-y\right) (2.3.2)

1.2.1 ロジスティック関数の微分式の確認
1.2.1.1 ロジスティック関数の微分式の左辺
\frac{\partial f\left(u\right)}{\partial u}=\frac{e^{-u}}{{\left(1+e^{-u}\right)}^2}  (2.3.2a)

1.2.1.1 ロジスティック関数の微分式の右辺
f\left(u\right)\left(1-f\left(u\right)\right)=\frac{1}{1+e^{-u}} \left(1-\frac{1}{1+e^{-u}}\right)=\frac{1}{1+e^{-u}}-\frac{1}{{\left(1+e^{-u}\right)}^2}
=\frac{\left(1+e^{-u}\right)-1}{{\left(1+e^{-u}\right)}^2}= \frac{e^{-u}}{{\left(1+e^{-u}\right)}^2} (2.3.2b)

1.3 尤度(データ\{(x_n, d_n)\}が得られる確率(w_{ji}をパラメータとして記載)
L\left(w_{ji}\right)= {\prod}_np\left(d_nx_n;w_{ji}\right)  (2.7.1a)
 = {\prod}_np{\left(d_n=1|x_n;w_{ji}\right)}^{d_n}p{\left(d_n=0|x_n;w_{ji}\right)}^{{1-d}_n} (2.7.1b)
= {\prod}_n{\left\{p\left(d_n=1|x_n;w_{ji}\right)\right\}}^{d_n}{\left\{1-p\left(d_n=1|x_n;w_{ji}\right)\right\}}^{1-d_n} (2.7.1c)
= {\prod}_n{\left\{y(x_n;w_{ji})\right\}}^{d_n}{\left\{1-y(x_n;w_{ji})\right\}}^{1-d_n}
 (2.7.1d)

1.4 誤差関数(尤度の対数をとり、符号を反転させた値。この値を最小化したい)
E\left(w_{ji}\right)= -{\sum}_n\left[d_n\log\left\{y\left(x_n;w_{ji}\right)\right\}+\left(1-d_n\right)\log\left\{1-y\left(x_n;w_{ji}\right)\right\} \right] (2.8)

1.5.1 誤差関数の微分(まず、u_j(x_n,d_n)をパラメータとして記載)
\frac{\partial E\left({x_n;u}_j\right)}{\partial u_j}=-\left[\frac{d_n}{y\left(x_n;u_j\right)}-\frac{1-d_n}{1-y\left(x_n;u_j\right)}\right]\left(\frac{\partial y\left(x_n;u_j\right)}{\partial u_j}\right) (2.8.1a)
 =-\left[\frac{d_n}{y\left(x_n;u_j\right)}-\frac{1-d_n}{1-y\left(x_n;u_j\right)}\right]\left(y\left(x_n;u_j\right)\left(1-y\left(x_n;u_j\right)\right)\right) (2.8.1b)
 =-\left[d_n(1-y\left(x_n;u_j\right))-\left(1-d_n\right)y\left(x_n;u_j\right)\right] (2.8.1c)
 ={y\left(x_n;u_j\right)-d}_n (2.8.1d)]
以上のように、誤差関数の微分は、非常に簡単な式になる(y-d_n)。

1.5.2 誤差関数の微分(w_{ji}をパラメータとして記載)
\frac{\partial E\left(x_n;w_{ji}\right)}{\partial w_{ji}}={\sum}_n\left[\frac{\partial E\left(x_n;u_n\right)}{\partial u_j}\frac{\partial u_j}{\partial w_{ji}}\right]  (2.8.2a)
={\sum}_n\left[\left({y\left(x_n;w_{ji}\right)-d}_n\right)z_i^{\left(L-1\right)}\right]  (2.8.2b)

多クラス分類のロジスティック関数と微分、尤度、誤差関数と微分

2.1 ロジスティック関数(Softmax関数)
y_k= z_k^{(L)}=\frac{exp(u_k^{\left(L\right)})}{{\sum}_jexp(u_j^{\left(L\right)})} (2.9)
k番目以外のユニットの出力を含めた式で、{\sum}_ky_k=1


2.2.1 ロジスティック関数の微分(u_k微分した結果)
\frac{{\partial y}_k}{\partial u_k}= y_k(1-y_k) (2.9.1)

2.2.1.1 ロジスティック関数の微分式の確認
まず、y_kを以下のように変形。
y_k= \frac{exp(u_k^{\left(L\right)})}{exp(u_k^{\left(L\right)})+{\sum}_{j\neq k}exp(u_j^{\left(L\right)})} (2.9.2a)
= \frac{1}{1 + \left\{\exp\left(-u_k^{\left(L\right)}\right){\sum}_{j\neq k}\left[\exp\left(u_j^{\left(L\right)}\right) \right]\right\}}
 (2.9.2b)

ここで、下記を満たすようにr_kを定義する。
exp(r_k)={\sum}_{j\neq k}exp(u_j^{\left(L\right)}) (2.9.2c)

すると、次のように指数部を纏めることができる。
y_k= \frac{1}{1 - exp({-(u}_k^{\left(L\right)}- r_k))} (2.9.2d)

r_ku_kに対して定数なので、次のsigmoid関数で表現できる。
y_k= sigmoid(u_k^{\left(L\right)}- r_k)  (2.9.2e)

sigmoidの性質から、上記をu_k微分すると下記が得られる。
\frac{{\partial y}_k}{\partial u_k}= y_k(1-y_k)  (2.9.2f)


2.2.2 ロジスティック関数の微分(l\neq kに対し、u_l微分した結果)
\frac{\partial y_k}{\partial u_l}=\frac{\partial}{\partial u_l} \frac{\exp\left(u_k^{\left(L\right)}\right)}{{\sum}_j\left\{\exp\left(u_j^{\left(L\right)}\right)\right\}}=- \frac{\exp\left(u_k^{\left(L\right)}\right)}{{\left[{\sum}_j\left\{\exp\left(u_j^{\left(L\right)}\right)\right\}\right]}^2}  \exp\left(u_l^{\left(L\right)}\right)
 (2.9.3a)
=- \frac{\exp\left(u_k^{\left(L\right)}\right)}{{\sum}_j\left\{\exp\left(u_j^{\left(L\right)}\right)\right\}}   \frac{\exp\left(u_l^{\left(L\right)}\right)}{{\sum}_j\left\{\exp\left(u_j^{\left(L\right)}\right)\right\}} ={-y}_ky_l (2.9.3b)


2.3 尤度(データ\{(x_n,d_n)\}が得られる確率。w_{ji}をパラメータとして記載)
L\left(w_{ji}\right)={\prod}_n\left\{p\left(d_nx_n;w_{ji}\right)\right\}={\prod}_n{\prod}_kp{\left(c_k|x_n\right)}^{d_{nk}}
 (2.10.1a)
={\prod}_n{\prod}_k{\left\{y_k\left(x_n;w_{ji}\right)\right\}}^{d_{nk}} (2.10.1b)

2.4 誤差関数(尤度の対数をとり、符号を反転させた値。この値を最小化したい)
E\left(w_{ji}\right)= -{\sum}_n{\sum}_kd_{nk}\log\left(y_k\left(x_n;w_{ji}\right)\right) (2.11)

2.5.1 誤差関数の微分(まず、u_j(x_n,d_n)をパラメータとして記載)
\frac{\partial E\left(x_n;u_j\right)}{\partial u_j}=-{\sum}_k\left[d_{nk}\frac{\partial \log\left (y_k(x_n;u_j)\right)}{\partial u_j}\right]  (2.11.1a)
 =-{\sum}_k\left[\frac{d_{nk}}{y_k}\frac{y_k}{\partial u_j}\right]  (2.11.1b) (以下、(x_n;u_j )の記載は省略)
=-\left[\frac{d_{nj}}{y_j}\left\{y_j\left(1-y_j\right)\right\} +{\sum}_{k\neq j}\left[\frac{d_{nk}}{y_k}\{-y_jy_k\}\right]\right]
 (2.11.1c) (2.9.2f、2.9.3より)
 =-\left[d_{nj}(1-y_j)-{\sum}_{k\neq j}d_{nk}y_j\right]   (2.11.1d)
=-\left[d_{nj}-{\sum}_kd_{nk}y_j\right] (2.11.1d)
=y_j{\sum}_kd_{nk}-d_{nj}
 (2.11.1f)
=y_j-d_{nj} (2.11.1g) ({\sum}_kd_{nk}=1より)
以上のように、誤差関数の微分は、非常に簡単な式になる(y_j-d_{nj})。

2.5.2 誤差関数の微分(w_{ji}(x_n,d_n)をパラメータとして記載)
\frac{\partial E\left({x_n;w}_{ji}\right)}{\partial w_{ji}}=\frac{\partial E\left(u_j\left(x_n;u_j\right)\right)}{\partial u_j}\frac{\partial u_j\left(x_n;u_j\right)}{\partial w_{ji}} (2.11.2a)
 =(y_j\left({x_n;w}_{ji}\right)-d_{nj})z_i^{\left(L-1\right)} (2.11.2b)

2.5.3 誤差関数の微分(w_{ji}をパラメータとして記載)
\frac{\partial E\left(w_{ji}\right)}{\partial w_{ji}}={\sum}_n\frac{\partial E\left({x_n;w}_{ji}\right)}{\partial w_{ji}}
 (2.11.3a)
 ={\sum}_n(y_j\left(x_n;w_{ji}\right)-d_{nj})z_i^{\left(L-1\right)} (2.11.3b)

感想

手で書いた式を入力するのは非常に疲れました。最初は、はてな記法でそのまま書こうとしたのですが、かなり疲れたので、下記の記事を参考にさせて頂き、少し楽ができました。ありがとうございました。

機械学習で勾配降下法の収束を加速できるか、ちょっと試行

深層学習のp.37に、誤差関数の谷底に高低差が少ない場合に収束が遅くなることへの対策として、「3.6.5 モメンタム」というものが書かれていました。これは、重み係数の修正量を計算するときに、前回の修正量の定数倍を加えるというもの。

機械学習から離れて、単に、関数の谷底を求めるだけならば、上記よりも、ニュートン法を用いたほうが良いと感じました。ただ、ニュートン法では、2次微分が必要であり、一般には2次微分を求めるのは難しいため、あまり使われていないと、どこかに書かれてました(どの本か忘れた)。

機械学習の理解を深めるために簡単なBackward Propagationプログラムを自作したので、これにニュートン法的なプログラムを入れ込んで少し試してました。

具体的には、谷底近くの曲面の形状を、各次元で2次関数で近似し、収束を高速化できないか試しました。

各次元で2次関数ということは、各次元で1次微分が1次関数ということなので、(l)回目の重みW_{ji}^{(l)}に対する誤差Eの勾配を\frac{\partial E}{\partial W_{ji}^{(l)}}としたとき、2つの点(W_{ji}^{(l)}, \frac{\partial E}{\partial W_{ji}^{(l)}})(W_{ji}^{(l-1)}, \frac{\partial E}{\partial W_{ji}^{(l-1)}})を結ぶ直線がx軸と交差する点(y=0となる点)を求めれば良いだけであり、簡単に計算できます。

繰り返し毎の誤差の変化がある程度少なくなってきたところで上記を行うと、確かに収束は速くなりました。ただ、誤差が非常に小さくなると、2つの点が非常に近くなり、直線の傾きを計算する際の誤差が大きくなり、W_{ji}の値が発散してしまいます。これを防ぐには、値が発散しそうなW_{ji}に対しては、モメンタムを用いれば良さそうな気がします。

なお、上記は、非常に単純な場合(2層のパーセプトロンで「XOR」を学習する場合)で試しただけです。

ちなみにニュートン法は、かなり古典的な手法なのでもっと最新の数学的手法を用いれば、勾配降下法の収束を、もっと加速できるのではないか? 数学の専門家が機械学習に加われば、機械学習が飛躍的に高速化する可能性があるのではないか? などと、夢想しているところです。

2週間ぐらい前まで、上記の試行と、別の試行を行っていたのですが、これに時間を掛けていたせいで、1カ月ぐらい前に買った本を読むのが遅れてしまいました。色々と夢想も良いかなと思っていたのですが、まずは、機械学習の基礎をしっかりと理解して、TensorFlowを自由自在に活用できるようになることを、当面の目標しようと思います。

追記

上記、W_{ji}の新しい値として、谷底となる点でのW_{ji}の値を使っていました。図で例示すると、下図の赤い点でした。なお、下図は機械学習で実際に使った値ではなく、近似対象が4次曲線であった場合を例として、計算で谷底を推定した図です。

ちなみに、横軸がW_{ji}の値で、縦軸はEの値です。また、青い線は近似対象として試した4次曲線で、2つの青い点は直近2回のW_{ji}の値です。青い線と重なった赤い曲線は、「直近の2回の(W_{ji}, E)の値と、そこでの1次微分値を元に近似した2次曲線」です。赤い点は計算で推定した谷底の点で、斜めの黒線は最直近のW_{ji}での接線、水平の黒線は(推定された)谷底での接線です。

いきなり谷底となるW_{ji}の推定値を使うのは、やりすぎですね。せめて、通常のニュートン法と同じように、谷底での接線と、直近のW_{ji}での接線との交点を使うべきですね(下記の図のオレンジの点)。

なお、下記のグラフは、谷底の部分を拡大してます。図示した部分での実際の曲線は殆ど水平です。縦軸は「+3.035」を基準とした差分を表しており、上端と下端での差は、わずか0.001です。

f:id:Itsukara:20160628070902j:plain

また本を買ってしまった(シンギュラリティ関連)+読書状況

本日、気晴らしに外出した際に、本屋で立ち読みしていたら、シンギュラリティ関連の本があり、ついつい買ってしまいました。まだ読んでいない本や、読みかけの本が沢山あるのに... 先日、機械学習関連の輪講に出てから、本の購入に関する心理的なタガが外れた気がします。

技術書と異なり熟考する必要はないので、楽しみながら読もうと思います。

以前に買って途中までしか読んでいなかった本

下記、以前に買って、1/3ぐらい読んだのですが、最初の1/3は、シンギュラリティの必然性に関し、同じようなことが繰り返し書いてあり、少し飽きてしまいました。そのため、残りの部分を読まずに放置してました。改めて後半をパラパラめくったところ、後半はシンギュラリティの内容が書かれてているので、この本も、後半含めて読もうと思いいます。

機械学習関連の読書状況

既に購入した機械学習関連の本は、深層学習を中心に読んでます。

以前に買った本で誤った説明が書いてあった「畳み込みニューラルネットワークのフィルター係数の逆伝搬方法」が一番気になったので、「Chapter 6 畳み込みニューラルネット」の「6.7 勾配の計算」を読んでいたのですが、少し分かりにくかったので、自分のために補足しておきます。(他の読者の方にも役立つようなことがあればうれしいですが...)

p.96で、重み行列Wの勾配として\partial Wという表記が出てきて分かりにくいと感じました。どうやら、\frac{\partial E}{\partial w_{ji}}を表しているらしいので、そのように書いてくれれば分かりやすかったのですが... 表記を変えて書き直して見ます。

本に書かれている下記の関係から始めます。(ちなみに、hは全てのフィルターを並べたベクトル、t_{ji}は「(l-1)層のユニットi」と「(l)層のユニットj」の係数をhから取り出すベクトル(1要素のみ1で他は0)」)

w_{ji}=t_{ji}^Th

上記をhr番目の要素h_r偏微分すると:
\frac{\partial w_{ji}}{\partial h_r}=t_{jir}

単純に、誤差関数Eh_r偏微分し、Ew_{ji}の関数であることと、上記を使うと下記になります。
\frac{\partial E}{\partial h_r}
=\sum_{i,j} {\frac{\partial E}{\partial w_{ji}} \frac{\partial w_{ji}}{\partial h_r}}
=\sum_{i,j} {\frac{\partial E}{\partial w_{ji}} t_{jir}}

ちなみに、本では、\frac{\partial E}{\partial h_r}({\partial h})_rと書いています。上記の右辺は、本のp.96の最後の式と同じですが、一般的な表記になっています。

後は、({\partial h})_rの式の前後に書かれた\frac{\partial E}{\partial w_{ji}}の計算式を使えば、\frac{\partial E}{\partial h_r}の値が計算できます。これでh_rに対するEの勾配が求められるので、後は、通常と同様に、この値を元にh_rの値を調整すれば良いです。

書き方が一般的ならば自明な式なので、一般的な書き方にして欲しかったです。

機械学習関連の本を何冊か買いました

本日、機械学習の勉強会に参加しました。30名ぐらいが参加し、3つぐらいのグループに分かれて活動しており、その中で、本の輪講を行っているグループに参加しました。

勉強会のタイトルには「初心者歓迎」とは書いてありましたが、みなさん、何らかの形で機械学習に係っている方で、TensorFlowなどを実際に使っている模様。そのうえで、中身を勉強したいということで、活動しているとのこと。しかし、輪講も既に13回目なので、本を1冊読み終わり、2冊目も来週で読了予定という状態でした。

私自身も、機械学習の中身が知りたいと思っていたので、参加しましたが、改めて、本をちゃんと読んだ方が良いと感じ、本日、何冊か購入しました。購入した本は、輪講で使われている本と、Amazonで評判が良いものを選びました。当面は、本を読んで、基礎的な部分を勉強する予定です。

購入した本

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

深層学習 Deep Learning (監修:人工知能学会)

深層学習 Deep Learning (監修:人工知能学会)

機械学習と深層学習 ―C言語によるシミュレーション―

機械学習と深層学習 ―C言語によるシミュレーション―

以前に購入して失敗した本

実は、1カ月ぐらい前に、機械学習関連の本を買ったのですが、内容や図の記号に関して説明が抜けている部分があったり、明らかに誤植と思われる部分が何箇所もあり、途中までしか読んでいませんでした。後からAmazonで見たら、評価が非常に悪かったので、評価を見ずに買ったことを後悔していました。やはり、評判は重要ですね。

イラストで学ぶ ディープラーニング (KS情報科学専門書)

イラストで学ぶ ディープラーニング (KS情報科学専門書)

ちなみに、内容が酷くて頭に来たので、私自身もカスタマーレビューを書き、掲載頂きました。

とりあえず、AWS無料枠の利用開始

AWS Summit Tokyo 2016に登録した人には、通常の1年間の無料利用枠に加えて、25 ドル分の無料利用クーポンプレゼントを頂けるとのこと。期限が6月30日だったので、とりあえず、AWS無料枠でアカウントを作成し、クーポンの申請を完了しました。クーポンを頂けるのは、1か月以内とのこと。

まだEC2インスタンスは作っていませんが、セキュリティ認証情報設定(特に安全のためのMFA設定)、IAM(Identity and Access Management)でのIAMユーザ作成(MFA設定含む)、グループの作成・ポリシー割り当て、使わないリージョンの無効化などを行い、準備だけは、ほぼ完了しました。

ただ、Linux環境はVirtualBoxで間に合うので、当面はAWSの必要性は薄いですが...

25ドルクーポンをもらったら、AWS固有のサービス(無料枠の範囲外が多い)を何か使ってみようと思います。

TensorFlowの勉強を再開しました

色々とわき道にそれていましたが、UDACITYのDeep Learning無料コースの勉強を、ようやく再開しました。

環境構築

まずは、TensorFlowを使う環境を再構築しました。DockerのTensorFlow環境は既にあったのですが、WindowsのDocker環境には、色々制限があることが分かったので、いくつかの環境構築を構築しました。

WindowsでのDocker環境の制限

  1. Docker関連のファイルの保管場所が「Cドライブ」に固定されている。そのため、SSD等でCドライブの容量が少ない場合は、容量が圧迫される。
  2. Windows側のディレクトリをDockerにマウントする場合、対象ディレクトリが「C:\Users」の下にあるものに制限され不便。
  3. TensorFlowの学習高速化に重要となる「GPU」が使えない。

対応策

上記「1.」と「2.」に関しては、VirutalBoxの仮想化環境にUbuntuをインストールし、AnacondaやTensorFlowを自分でインストールしました。それほど難しくなかったので、初めからDockerを使わずに、VitualBoxを使えば良かったと思います。

上記「3.」に関しては、Dockerで使えないか、VirtualBoxで使えないか、など、いろいろと調べたのですが、結局ダメでした。そこで、Windowsが入っているPCの、あまり使っていないHDDに、Ubuntuを直接インストールしました。Webでの情報によると、GPUを使った場合、CPUに比べて性能が20倍~50倍ぐらい速くなるとのこと。かなり期待していたのですが、PCのグラフィックボードが貧弱なせいか、CPUの6倍しか出ませんでした。ちなみに、CPUはi7-4770K、GPUはGTX760、メモリは16GBと、2~3年前の標準機です。

少し迷ったところ

GPU利用環境構築の際、最初はUbuntu 16.04をインストールしたのですが、IntelNvidiaが提供するグラフィック関係ライブラリが16.04に未対応だったので、14.04に戻す必要があり、2度手間になりました。

既存のWindows環境への影響が一番心配でした。これを出来るだけ少なくするために、Ubuntuのインストールでディスク割り当てを行う際に、自動割り当てではなく、手動割り当てを選択しました。そのうえで、ブートローダーのインストール場所は、Ubuntuをインストールするディスクにし、ルートパーテション(/)とスワップ領域を自分で割り当てました。

UDACITYのAssignmentsに取り組み中

以前に途中までやったUDACITYのTensorFlow Assignmentsを再開しました。このAssignmentsには、課題(Problem)がいくつか書かれており、その課題の回答が見つからなかったので、取り組み結果を追記したファイルを「https://github.com/Itsukara/TensorFlow-UDACITY-tryout:GitHub)にアップロードしました。

最初のAssignmentは、データの加工・整理のみです。対象となるデータはNOTMNISTというものなのですが、他の機械学習でよく使われるMNISTと異なり、あまり整理されていないデータとのこと。課題への取り組みの一環で、中身を表示して確認したところ、全体が真っ白な画像が1%以上も含まれていました。また、人間が見ても、何の文字かわかり難いようなものも含まれています。参考までに、データの一部を表示した結果を下記に載せます。結構、ゴミが混じっている気がします。

f:id:Itsukara:20160624021005j:plain

今後

UDACITYのAssignmentはNOTMNISTから始まり、いきなり通常とは異なるデータを扱うことになっています。少しイレギュラーな気がしたので、もう少し標準の機械学習から勉強した方が良いのではないかと思い始めています。例えば、TensorFLowの本家のTutorialは、標準的なデータであるMINISTから始めているので、そちらの方が良いかも... あるいは、TensorFlowよりも前に、scikit-learnぐらい見て置いた方が良いのではないか? また、機械学習の理論面も、少し勉強した方が良いのではないか? など、改めて、少し迷い始めています。

SORACOMはIOT専用と思ったほうが良い

IOTのテスト用にSORACOMのSIM+USBドングルを買ったのですが、メモリ量が数十KB程度のマイコンでは繋がらないので、WindowsノートPCで使おうと思っていました。しかし、改めてSORACOMサイトで料金を確認したところ、通信回線が上りの場合は料金が安いのですが、下りでは3倍以上高く、IOT以外での使用には向いていないことが分かりました。

具体的な料金は、下記です。通常時間と深夜で異なり、深夜の方が安くなっています。深夜は、下りも0.2円/MBと安くなりますが、これは、ファームウェアなどのダウンロードを想定しているとのこと。

  • 通常時間帯(日本時間 午前6:00-翌 午前2:00)
料金クラス 通信速度(上り・下り) 利用料金(上り・下り)(税別)
s1.minimum 32 kbps 0.2 円 / MB・0.6 円 / MB
s1.slow 128 kbps 0.22 円 / MB・0.7 円 / MB
s1.standard 512 kbps 0.24 円 / MB・0.8 円 / MB
s1.fast 2 Mbps 0.3 円 / MB・1 円 / MB
  • 深夜時間帯(日本時間 午前2:00-午前6:00)
料金クラス 通信速度(上り・下り) 利用料金(上り・下り)(税別)
s1.minimum 32 kbps 0.2 円 / MB・0.2 円 / MB
s1.slow 128 kbps 0.2 円 / MB・0.2 円 / MB
s1.standard 512 kbps 0.2 円 / MB・0.2 円 / MB
s1.fast 2 Mbps 0.2 円 / MB・0.2 円 / MB

単に従量制で安いSIMということならば、FREETEL SIMの方が良いですね。こちらは、上りと下りの違いもなく、LTEなので通信速度が最大220Mbps出ます。IOTで使う場合も、条件によっては、FREETELの方が安くなります(データ量が多い場合)。

SORACOMの一番の利点は、SORACOMコンソールで、SIMの休止・再開ができる点、通信量を簡単に把握できる点、沢山のSIMを纏めて管理できる点などであり、やはりIOT専用と思ったほうが良いですね。逆に、IOT以外に使うのには向いていないことが、今回分かりました。SORACOMは、IOTをターゲットとしてスタートした会社ですから、当然ではありますが...

今回購入したUSBドングルは、SORACOM以外でも使えると思うので、別のSIMも検討予定です。なお、1000円分のクーポンが活用できるので、当面はSORACOM SIMを利用予定です。