移行先
「ソフトウェアアーキテクチャの基礎 まとめ②」
移行先の長所と短所
長所
- 画像がある程度フリーで(サブスク料金に入っている。)使えるので、それっぽいサイトが簡単に作れる。
- テンプレがあるからサイト全体の見た目も簡単に作れる。
- とにかく簡単にそれっぽく作れる。
記述していて無理があると気がついたので、まずは1章までとする。そして理解できていない点も明らかになったので、今後も継続的にエントリを記述していく。
それは、「すべてはトレードオフ」だ。
これは本書、すくなくとも8章まで読み進めるなかで、聴き飽きるレベルで口酸っぱく言われるフレーズだ。
そして本書に通底する思想である。
著者の言を借りれば、「すべてはトレードオフで、ベストな選択なんて存在しえないのだから、少なくとも"最悪の選択"だけは避けろ」である。
では、その「最悪の選択」を避けるにはどうすればよいか? それを各章ごとに学んだことをまとめて、自分なりの解釈を記述していく。
それは凄まじい速度で変化するソフトウェアの世界において、既存の書籍は当時の時代背景や技術のエコシステムに即して記述され、20年前と現在(2022年)においては、まったく文脈が異なっているからだ。本書ではそれをDevOpsなどを例に挙げて、ソフトウェアアーキテクチャは文脈、つまり時代背景とエコシステムの中で初めて理解されることを強調している。
これは「はじめに」の項でも述べられている「公理を疑う」というテーマにも繋がってくる。
前述の理由も相まって、現代ではソフトウェアアーキテクト、そしてソフトウェアアーキテクチャの定義は非常に曖昧になっているとする。
著者らはこれらへの答えとして、ソフトウェアアーキテクチャを取り扱うにあたって、4つの構成要素からなるものだと主張する。それは、「アーキテクチャ特性」「アーキテクチャ決定」「構造」「設計指針」だ。
本書ではアーキテクトはどうあるべきかについても重きをおいて記述されている。非常に教育的であり、また人間臭く軽視されがちな政治を理解すべきということまでも言及されている。
これはアーキテクトの役割としてソフトウェアのアーキテクチャを考える上で、ドメイン知識のより豊富な人物から情報を引き出したり、営業や顧客のニーズを理解し、彼らとの折衝を担当したり、プログラマのミクロな視線や立場とも折り合いをつけて、彼らが実装する際に設計指針を満たすように協力してもらう必要があるからだろう。
本書ではアーキテクトへの期待されることとして8つ挙げられている。その中でも個人的に印象深く、意識すべきだと感じたものを挙げる。
決定された事項に関して、アーキテクトはどうやって構造が機能しているかは解明可能であるが、「なぜ」その決定がなされたかは推測し導き出すことは難しい。だからドキュメントを残すにしろ、アーキテクチャ決定を為すにしろ、なぜその選択をしたかを残し、説明可能にしておくことは重要なのだと理解した。
ソフトウェアアーキテクチャの基礎 Mark Richards, Neal Ford 著 島田浩二 訳 2022/3/4 株式会社オライリー・ジャパン
また、『ゼロから作るディープラーニング』の勉強まとめ。
・パーセプトロンには長所短所があり、長所は「多層化すれば複雑な関数を表現できるだけの可能性を秘めている」ということ、短所は「そのパラメータを設定するには人手が必要である」ということだ。そしてニューラルネットワークは、その短所を解決するための手法である。
・パーセプトロンは「ステップ関数」を活性化関数に採用しているが、活性化関数をほかのものにすれば、ニューラルネットワークが実現できる。よく利用されるものに、シグモイド関数がある。
・シグモイド関数はステップ関数と比較すると、「滑らかさ」が大きく異なるが、この要素がニューラルネットワークの学習において重要である。そして「0か1か」のステップ関数に対して、シグモイド関数は「0.731」などの実数を返す。
対して共通項としては、入力が小さければ「0」に近い出力を、逆に入力が大きければ「1」に近い出力をする、というように信号の重要性が高い場合には大きな値を、低ければ小さな値を出力する。
そして、どんなに入力信号が小さかろうが、大きかろうが、出力信号を0から1の間に収められる。
・ReLU(Rectified Linear Unit)関数は、入力が0を超えていれば入力値をそのまま出力し、0以下ならば0を出力する関数で最近主に利用されるようだ。
・出力層の設計
ニューラルネットワークは分類問題と回帰問題の両方に用いられる。どちらの問題に用いるかで出力層の活性化関数は異なる。回帰問題では恒等関数、分類問題ではソフトマックス関数を一般的に用いる。
・ソフトマックス関数実装上の注意
ソフトマックス関数では入力によって指数関数の値が容易に大きくなり、コンピューターの計算の限界、オーバーフローを起こす原因となりえる。それを踏まえた実装をする必要がある。
・ソフトマックス関数
ソフトマックス関数の重要な特徴として、出力は0から1.0の間の実数になり、その総和は必ず1になるという点。そしてこの特徴のおかげで出力を「確率」として解釈できる。
ニューラルネットワークのクラス分類では、一般的に出力が一番大きなクラスだけを認識結果とする。そして、ソフトマックス関数では指数関数を用いるために、各要素は単調増加するだけであり、出力層のソフトマックス関数を省略可能である。
・出力層のニューロンの数
出力層のニューロンの数は解くべき問題に応じて適宜決定する必要がある。
・前処理
機械学習では(他でもそうだろうが)正規化などの前処理が重要になってくる。識別性能の向上や学習の高速化などに貢献する。
数値計算を扱うライブラリでは大きな配列の計算への最適化が行われており、バッチ処理によって配列をまとめることで処理時間を短縮できる。またニューラルネットワークの計算において、データ転送がボトルネックになる場合にも、バッチ処理によってバス帯域の負荷を軽減できる。
あとは躓いたけど、振り返ってみればバカだったなと思う些末な部分。
・3章のp73でインポートする「dataset.mnist」はオライリーのGitHubからインストールしなければならない。当たり前だ。そして「issues」にも挙がっているが、ディレクトリを直接指定してやらなければならなかった。
・p76の「init_network」関数で「open」関数を用いる際にも、ディレクトリを直接指定してやらねばならなかった。これは他のエラーも出ていたので、自分だけかもしれない。
参考文献
『ゼロから作るディープラーニング』斎藤康毅 著
斎藤康毅『ゼロから作るディープラーニング』の2章まで進めたので、まとめ。
といっても書籍の章末にまとめ欄があって、これ以上簡潔には書けないだろうから、ほぼ引用のようなものだが。
・パーセプトロンはアルゴリズムの一種。入力によって出力が変化する。
・パーセプトロンにはパラメータがあり、「重み」と「バイアス」からなるが、両者をまとめて「重み」とする文献もある。
・パーセプトロンにより、ANDやORゲートなどの論理回路を表現でき、ANDやNANDなどは線形の表現しか行えないが、層を2層以上にすることで、XORなどの非線形な表現を行える。
・これを多層化すれば、コンピュータを表現することも可能である。
以上が学んだことだ。まだまだPythonの文法にも慣れていないので、そこも意識的にコーディングする。