Coursera Machine Learning week2 その1
- 重回帰分析 (multivariate linear regression)
- フィーチャースケーリング(Feature Scaling)とmean normalization
- 最急降下法の学習効率の選び方について
- データのフィットさせる仮説関数の形式の選択肢はたくさんある
- 正規方程式
重回帰分析 (multivariate linear regression)
単回帰分析(Linear regression with one variable)には以下の通り一つしか変数がないが、
これが複数ある場合のデータセットでの分析を行える関数があるこれを重回帰分析と呼ぶ
新しく提示された定義
i件目の学習データのj番目のフィーチャ(変数)の値
i件目の学習データのフィーチャ(変数)ベクトル
学習用のデータセットの数
フィーチャ(変数)の数
1として扱う
上記の関数はweek1で教わった行列を使った形に置き換え可能
重回帰分析の場合の目的関数
変数がいくつ増えても以下の式で表すことができる
フィーチャースケーリング(Feature Scaling)とmean normalization
最急降下法(Gradient Descent)の収束パフォーマンスを上げることができる
学習データとして与えたもののレンジが違いすぎる場合、最急降下法のパフォーマンスに影響が出る。その改善として
学習データのレンジを またはになるように変換すると早く収束するようになる。
Feature Scaling
最大値で割る
mean normalization
平均が0に近づくように調整する
最急降下法の学習効率の選び方について
大きすぎると収束せず、遅すぎると時間がかかる
Andrew先生のおすすめは0.001から初めて3倍ずつ増やしていき、
収束しない学習効率の一つ手前のものを利用する方法。
0.003→0.01→0.03
データのフィットさせる仮説関数の形式の選択肢はたくさんある
1時関数、2時間数、3時間数、対数
などのグラフのどれがデータに会うかは開発者が選ぶことができる。
今後自動でどの数式が最適か判別するアルゴリズムを紹介すると行っていたが、今は「選べる」ことを理解して入ればいい。
ただし、3時間数などを選んだ場合はよりフィーチャースケーリングが大事になってくる。
(値の範囲はn乗のオーダーで膨らんでいくため。)
SpectreのPoCの動かし方
世間を賑わしているGoogle Zero Projectが発見したCPUに関する2つのバグ、meltdownとspectreですが、 spectreのpocが公開されていたので手持ちのKali Linuxで動かしてみました。
char *secret = "The Magic Words are Squeamish Ossifrage.";
この文字の内容が不正にアクセスされてしまうデータです 適当に自分の名前などに置き換えてやって見ましょう。(私はpassw0rdで試しました)
また125行目のシングルクォートは環境によってはうまく動かない原因になるのでダブルクォートに置き換えましょう。
(value[0] > 31 && value[0] < 127 ? value[0] : ’?’), score[0]);
↓
(value[0] > 31 && value[0] < 127 ? value[0] : "?"), score[0]);
適当な名前をつけてコンパイルして
gcc <適当な名前>.c
実行します
./a.out
結果
Reading at malicious_x = 0xffffffffffdfed68... Unclear: 0x70=’p’ score=972 (second best: 0x01 score=750) Reading at malicious_x = 0xffffffffffdfed69... Unclear: 0x61=’a’ score=992 (second best: 0x01 score=725) Reading at malicious_x = 0xffffffffffdfed6a... Unclear: 0x73=’s’ score=989 (second best: 0x00 score=604) Reading at malicious_x = 0xffffffffffdfed6b... Success: 0x73=’s’ score=23 (second best: 0x00 score=9) Reading at malicious_x = 0xffffffffffdfed6c... Success: 0x77=’w’ score=37 (second best: 0x01 score=16) Reading at malicious_x = 0xffffffffffdfed6d... Success: 0x30=’0’ score=37 (second best: 0x01 score=16) Reading at malicious_x = 0xffffffffffdfed6e... Success: 0x72=’r’ score=55 (second best: 0x00 score=25) Reading at malicious_x = 0xffffffffffdfed6f... Success: 0x64=’d’ score=225 (second best: 0x00 score=110) 以下略
C言語は触ったことがあ流ので100行くらいのコードなら読めるかも、と思いましたが、全然わからないのでやめました。 解説はこちらの記事が詳しいです
Mac & Safari & US配列ユーザーがいますぐ見直すべきキーボードショートカット
macOSではCmd + Qがアプリケーションの終了となっています。 もちろんSafariも例に漏れずこのキーバインドでブラウザが終了してしまいます。
USキーボードでは英数/日本語の切り替えはCmd + Spaceです。 Cmd + Spaceで切り替えごに「q」から始まる単語を打つ、ということを高速で行うと間違ってCmd + qのアプリケーション終了のショートカットが走ってしまうことが良くあります。*1 わざわざ変換なんてしているのだから、ブラウザに長文でも書き込んでいるときに限って起こります😭
というわけで・・・
いますぐ Cmd + Q を無効化しましょう!!!
キーバインドの設定はSafariの環境設定ではなく、OS本体のシステム環境設定で行います
システム環境設定 > キーボード > ショートカット > アプリケーションの欄に
Safari>Safariを終了を追加しキーバインドを変更しましょう。
私は Cmd + Shift + Q を終了に割り当てています。 同じ要領でCmd + W(タブを閉じる)も変更しています*2
そもそもなぜCmd + Qなんて打ちやすいキーバインドにこんな危険な操作が割り当てられているのかわかりません。 Safariを急いで消す必要がある人なんているんでしょうか?
何はともあれ、ブラウザに打ち込んだ長文が消える人が一人でも少なくなりますように😇
Effective Java item1:Consider static factory methods instead of constructors
サービスプロバイダフレームワークの検証ができていないが、時間をかけすぎているのでこの辺で投稿。*1
コンストラクタだけでなく、static factoryメソッドも検討しましょう。
Boolean temp = new Boolean(true);//コンストラクタ Boolean temp2 = Boolean.valueOf(true);//スタティックファクトリーメソッド
Static Factoryのメリット
1.名前が持てる
- コンストラクタはクラス名のみ。
- コンストラクタが複数ある場合は引数の意味を注意して覚える必要がある
- 複数のコンストラクタが存在する場合、適切な名前を持つ複数のStatic Factoryメソッドに書き直した方がいい
2.呼ばれるたびにインスタンスを作成しなくてもよい
- 例えば:FlyWeightパターン、Singletonパターン
- 既存のインスタンスを使い回す柔軟なコーディングが可能。
3.サブクラスのインスタンスを返すことができる
例えば
class Dog extends Animal
こんなクラスがあるとして
Dogのスーパークラスのstatic factoryメソッドがdogインスタンスを返すことができる。
Animal animal = Animal.newDog("potchi");
animal.bark();
4.引数によって返すインスタンスのクラスを変更できる*2
例えばEnumSetクラスのstatic factoryメソッドのnoneofは引数のenumの数が - 64以下ならRegularEnumSetを - 65以上ならJumboEnumSetを返す
ちなみにこれはRegularEnumSet内部でEnumの要素の有無をlong型(64bit)の変数で管理しているからであり、 65以上の要素を持つEnumは扱えないので、代わりに内部でlong型の配列で値を保持するJumboEnumSetを返す。*3
5.戻り値のクラスはstatic factoryメソッド作成時に存在していないくていい
JDBCなどのライブラリの設計の根幹となる考え方らしい。Effective Java第2番にはサービスプロバイダーフレームワークの例が乗っていましたが、 これがごっそり削除されました。ここはJDBCなどをダウンロードしてしっかり検証すべき。*4
第2版にあったサービスプロバイダフレームワークのコード例(項目1)が、第3版のレビュー版では分かり易いコード例に変更されていたのですが、最終版ではコード例が全部削除され、文章だけの説明となっていました。|『Effective Java Third Edition』 https://t.co/JW4AxHh0Rb
— Yoshiki Shibata/柴田芳樹 (@yoshiki_shibata) 2018年1月3日
とのことだけどどんなのが載ってたんだろう。。。気になる。
デメリット
1.public,protectedのコンストラクタのないクラスははサブクラス化できない
例:コレクションフレームワーク内の便利な実装クラス*5はサブクラス化することができない。
2.適切な名前をつけないと見分けがつかない
コンストラクタはそのままクラス名がメソッド名になるが、スタティックファクトリは実装者が考えて命名する必要がある。以下のような命名が一般的らしい
from
引数の型からファクトリメソッドの型へ変換を行う
以下の例だとDateクラスのファクトリによってInstant -> Dateの変換が行われている
// example of "from" Instant instant = Instant.now(); Date d = Date.from(instant);
of
複数のパラメータを含んだinstanceを作る
Set<Rank> faceCards = EnumSet.of(Rank.JACK, Rank.QUEEN, Rank.KING);
valueOf
その値をもつオブジェクトを作る
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
instance または getInstance
インスタンスが一つしか存在しないインスタンスを返す(シングルトン)
Calendar cal = Calendar.getInstance();
create または newInstance
getInstanceと違って返されるインスタンスはそれぞれ異なっている
Object newArray = Array.newInstance(String.class, 4);
getType
getInstanceに似ている。
FileStore fs = Files.getFileStore(path);
Filesクラスは他にも以下のようなgetType系のstatic factoryを保持している
getAttribute(Path, String, LinkOption...)
getFileAttributeView(Path, Class
newType
getTypeと違って呼ばれるたびに返されるインスタンスを生成する
BufferedReader br = Files.newBufferedReader(path);
type
getType,newTypeの代替として使用される
Vector<String> v = new Vector(); v.add("aa"); v.add("bb"); List<String> testList = Collections.list(v.elements());
感想
- サービスプロバイダフレームワークの箇所は説明が増えているがコード例がごっそり消えている
- Static factoryを使えばジェネリクスをコンストラクタ、型両方に書く煩わしい記述を省略できる!との指摘は消えていました
Map<String,Integer> test = new HashMap<String,Integer> Map<String,Integer> test2 = HashMap.newInstance
ちなみにGoogle Collectionとして開発が進められていたGuavaですが、
著者のJoshua blochが関わっているためか、Mapクラスにこのsatatic factoryメソッドが実装されています
Map<KeyType, LongishValueType> mapGuava = Maps.newLinkedHashMap();
The library's design and code were advised and reviewed by Joshua Bloch
Sunでコレクションを一通り作った知見を生かしてGoogleで作り直されたのでしょうか。 なかなか興味深いOSSですね😎
Coursera Machine Learning week1 まとめ
前からやろうと思っていたCourseraのMachine Learningのコースを始めた。
動画は外出先では見れないので、主に終業後、自宅で進めている。 ちょうどWeek1が終わったところなので勉強した内容を投稿
注意していること
他の勉強の進捗を下げない
最近は「テスト駆動開発」と「Eeffective Java」の写経と「プログラマーのためのSQL」の読書を進めているが、これらはやめない。
英語をボトルネックにしない
字幕がついてるから英語無理な人でもできる、との評判だが、出題問題などは訳されておらず英語力が皆無の場合は授業を進めるのが困難。個人的には「英語ができないこと」を理由に時間をかけたくない。対策として、各教材に消化目安時間が表示されているが、文章読解にそれ以上の時間をかけている場合は躊躇なく残りの文章をGoogle翻訳にぶち込むことで対処。
iOSアプリの開発で有名な堤さんもこの講座を受講したそうだが*1、堤さんも英語は躊躇なくGoogle翻訳にぶち込む派らしい。*2
ちなみに僕は英語の記事を読むときは、躊躇なく「最初から」グーグル翻訳に頼ります。大筋を理解したあとに、興味があるところ・意味がわからないところだけ改めて原文を読む。https://t.co/fPUPPaSrxi
— Shuichi Tsutsumi (@shu223) 2017年12月19日
学んだこと
Couseraの感想
Anderw先生自身がCouseraを始めたこともあってか、Couseraの使い方、というより授業の設計がかなりうまいと思う。 またノートも受講生が取らなくていいスタイルになっている。(完全に授業の内容に集中できる感じ。)
大学の授業でもノートを取らなくても良いように、あらかじめプリントで配ったり、授業のサイトにまとめておいて欲しかった。 自分は数値計算的な授業で毎回こういう数式を黒板から写経した覚えがあるが、あれは本当に時間の無駄だったと思う。写すことに必死で理解する時間がすごく少なくなるから。
良かったところ
- 動画とリーディングの2パート構成
- 動画の途中で画面が切り替わって選択問題がたまに出される。
- 授業中に先生に当てられる感じ。
- 今後はプログラムの提出も催促されるらしいので楽しみ
- 動画の途中で画面が切り替わって選択問題がたまに出される。
ここが微妙
ローカライズが微妙。まぁ有志のかたがやっているので仕方がない部分があるが、 翻訳の日本語自体は問題ないが、字幕の消えるタイミングが早すぎたり、ずれていたりで細かいところが気になる。*3
iOSアプリの挙動が不安定。DLした際はできの良さに驚いたが、すぐフリーズして使い物にならなくなった。動画がDLできるっぽいけど品質が上がればiPadなどにDLしてどこでも大学の授業を受けれるようになるのかもしれない。
他に必要な大学の価値は
- オフィスアワー
- 実験
- TAによるサポート
だと思うのですべてなんらかの手段で代替できれば、未来の大学にとって変われると思う。
授業の感想
- 難易度的には数学は中学生レベルのものがあれば理解できると思う
- 理系とか文系とかほとんど関係ないレベル。
- まじでこれが何を表しているかわかって入れば授業にはついてこれる。
- 流石に1時関数をグラフに起こすとどうなるかとかはandrew先生も解説しない
- 算数・数学の回避を最優先に人生を生きてきた人間には辛いと思う
- 分数の計算が怪しい人とか普通にいるし。
- 使われている数式を全て理解するには微分・偏微分・解析の知識が必要
備考
- はてなブログタイトルにに# や - を使わない方が良さそう
- リンクを貼った時の埋め込みに失敗する。
- この件でエントリを何度も作り直して投稿しました。通知など過剰に行ってましたらすみません。
- はてなブログでtex記法を使うとMarkdown記法と一部の記号が衝突してしまいうまく表示されないことがある。
プレビュー後のうまくレンダリングされなかったtexをコピペして下書きのtexの下に貼り付けて、消えているもの (Markdownとしてレンダリングされたもの)を見つけてエスケープすると良い。
数式の表現はこれを使って求めている
- はてなblogのtex記法では\indentや\newlineが使えない?texの解析エンジンの仕様か?
- \newlineは\\でできる模様。
- octaveはweek2で入れる模様。
- 私はもう入れましたが、トラブル続きのmacでもなぜかすんなり入りました。
Coursera Machine Learning week1 その3
行列とは
大括弧に閉じられた数字の配列のこと
上の例は3*2の行列。(行数*列数で表現する)
と表すこともある。
各要素への参照は
- i:行
- j:列
で表す。
例)
ベクトルとは
行列の特殊な形にすぎない。
n × 1の行列のこと。
上記の例は3次元のベクトル。
と表すこともある。
で上からi番目の要素を参照する
プログラミングとの兼ね合いでiが0始まりの場合と1始まりの場合の2パターンがあるが、この講義では基本的に1始まりとしている。
行列の足し算
同じ位置にある数値を足し合わせるだけ。同じ次元の行列しか足せない。
行列の掛け算
行列の各要素に実数をかけるだけ。
行列と行列の掛け算
m行n列の行列 とn行o列の行列のみが積算が可能である
結果の行列の形はm行o列の行列になる。
[m × n] × [n × o] = [m × o]
片方の列と片方の行の数が一致しないと掛け算不可。
行列の掛け算には可換性がないことに注意(not commutative)
行列の掛け算にはスカラ(実数)の場合と同じく、結合法則が成り立つ
スカラ: (3 × 5 ) × 2 = 3 ×(5×2)
行列:
逆行列
Aに対して
が成り立つのこと
(補足:は単位行列)
逆行列は以下のようにoctaveではpinv関数で求められる
octave:8> a = [3,4;2,16] a = 3 4 2 16 octave:9> pinv(a) ans = 0.400000 -0.100000 -0.050000 0.075000 octave:10>
逆行列は正方行列(行数と列数が一致する行列)にのみ存在し
また全ての正方行列が逆行列を持つとは限らない。
逆行列を持たない正方行列のことを特異行列(singular)や縮退行列(degenerate)と行ったりする。
行列の転置(transposition)
ある行列Aに対して
となるようなBを作ることを行列の転置と呼ぶ
またこのようなBをとも表現する
Coursera Machine Learning week1 その2
week1の内容が長すぎるので3つに分けます
- 最急降下法(Gradient Descent)
- 最急降下法(Gradient Descent)を二条誤差目的関数(Squared error function)に適応して目的関数のパラメータを求める方法
最急降下法(Gradient Descent)
- 学習効率(Learning rate):
- 導関数項(derivative term):
導出数項は少しずつ0に近づくため、学習効率が固定されていても局所的最小値に収束する
最急降下法(Gradient Descent)を二条誤差目的関数(Squared error function)に適応して目的関数のパラメータを求める方法
- 2.目的関数()を適応する
- 4.最終形
- 最急降下法を実装するときの注意
- 必ずとを同時に更新すること
- 局所最適(Batch)に落ち着く問題
- 最急降下法ではローカル最適(Batch)に落ち着いてしまいグローバル最適を発見できない恐れがある
- 凸型関数を利用すれば必ずグローバル最適を発見できる(曲最適に落ち着かない)
*1:どう変換したのかよくわからない