ブログを移行しようか迷っている

移行先

こちら

「ソフトウェアアーキテクチャの基礎 まとめ②」

移行先の長所と短所

長所

  • 画像がある程度フリーで(サブスク料金に入っている。)使えるので、それっぽいサイトが簡単に作れる。
  • テンプレがあるからサイト全体の見た目も簡単に作れる。
  • とにかく簡単にそれっぽく作れる。

短所

  • 表層だけで、もちろんカスタマイズ性が低い
  • markdownがおかしい。コードのシンタックスハイライトはほぼ付かない

『ソフトウェアアーキテクチャの基礎』勉強まとめ①

「ソフトウェアアーキテクチャの基礎」 オライリー 2022のまとめ①

  • 自身のアウトプットとしてかなり久しぶりだし、質が低いかもしれないが、それは理解度の鏡写しなので質よりもまずは数で行く。
  • まず本エントリの記述者である僕のバックグラウンドを述べる。
    • 文系からのWeb系のプログラマ職へ新卒入社し、現在までテストや開発に従事している。
    • コンピュータサイエンスを学んでおらず、現時点でもなにか体系だって学習したわけではないので、その辺りの知識、つまり基礎が欠落していると言わざると得ない。
    • 業務では、既存システムのパフォーマンスチューニングや、既存機能の刷新とそれに伴って再設計などを具体的に行なっている。
    • 3年目に入り、体系的に勉強して来なかったことへの焦りや、自身のスキルの伸びを感じられないことが最近の悩みになっている。

8章までまとめるつもりだった…

記述していて無理があると気がついたので、まずは1章までとする。そして理解できていない点も明らかになったので、今後も継続的にエントリを記述していく。

本書を8章まで読んだ今、キーフレーズで主題を表現すると...

それは、「すべてはトレードオフ」だ。

これは本書、すくなくとも8章まで読み進めるなかで、聴き飽きるレベルで口酸っぱく言われるフレーズだ。
そして本書に通底する思想である。
著者の言を借りれば、「すべてはトレードオフで、ベストな選択なんて存在しえないのだから、少なくとも"最悪の選択"だけは避けろ」である。

では、その「最悪の選択」を避けるにはどうすればよいか? それを各章ごとに学んだことをまとめて、自分なりの解釈を記述していく。

1章:イントロダクション

なぜ本書が書かれたか?

 それは凄まじい速度で変化するソフトウェアの世界において、既存の書籍は当時の時代背景や技術のエコシステムに即して記述され、20年前と現在(2022年)においては、まったく文脈が異なっているからだ。本書ではそれをDevOpsなどを例に挙げて、ソフトウェアアーキテクチャは文脈、つまり時代背景とエコシステムの中で初めて理解されることを強調している。
これは「はじめに」の項でも述べられている「公理を疑う」というテーマにも繋がってくる。

ソフトウェアアーキテクチャを扱うには

 前述の理由も相まって、現代ではソフトウェアアーキテクト、そしてソフトウェアアーキテクチャの定義は非常に曖昧になっているとする。
 著者らはこれらへの答えとして、ソフトウェアアーキテクチャを取り扱うにあたって、4つの構成要素からなるものだと主張する。それは、「アーキテクチャ特性」「アーキテクチャ決定」「構造」「設計指針」だ。

  • 構造
    • あるシステムに実装するアーキテクチャスタイルの種類(マイクロサービス、レイヤードなど)のことを指す。下記の3項目と併せて考慮し、言及することで初めて、アーキテクチャについて語ったことになるほど、「構造」は一側面を表しているものに過ぎない。
  • アーキテクチャ特性
    • アーキテクチャ特性とは、システムの成功基準を定めるもの。システムの機能について知識を必要としないが、システムの機能には欠かせない構成要素となっている。
    • そして本書では、このアーキテクチャ特性を重視している。
  • アーキテクチャ決定
    • システムをどのように構築するか定めるもの。つまり、各アーキテクチャでその層がどこにアクセス可能かなどという、システムの制約を形成するもので、規律を作り上げるものだと理解した。
  • 設計指針
    • 最後の設計指針は、厳しい制約などではなく、あくまでも「ガイドライン」であるとしている。なぜなら、厳しい制約で全てのアーキテクチャ決定を作り上げ実装していくのは不可能だからだとしている。

アーキテクトへの期待

本書ではアーキテクトはどうあるべきかについても重きをおいて記述されている。非常に教育的であり、また人間臭く軽視されがちな政治を理解すべきということまでも言及されている。
これはアーキテクトの役割としてソフトウェアのアーキテクチャを考える上で、ドメイン知識のより豊富な人物から情報を引き出したり、営業や顧客のニーズを理解し、彼らとの折衝を担当したり、プログラマのミクロな視線や立場とも折り合いをつけて、彼らが実装する際に設計指針を満たすように協力してもらう必要があるからだろう。
本書ではアーキテクトへの期待されることとして8つ挙げられている。その中でも個人的に印象深く、意識すべきだと感じたものを挙げる。

  • アーキテクチャを継続的に分析すること
    • こちらは前述のソフトウェア業界の凄まじい速さでの変化に関連してくる。例えばあるシステムがあったとして、それが5年前に構築されたもののままであったらどうだろうか?もっと言うと10年前なら?そのような、全く変化していないシステムは少ないかもしれないが、もしそのシステムがあったら、すぐにでもアーキテクチャが見直されるべきだろう。結果として似たアーキテクチャに落ち着くかもしれないが、とにかくそのアーキテクチャが「最悪の選択」でないことは継続して、かつソフトウェアアーキテクトであるならば、常に検証し続けなければならない、と本書は説いている。
    • そして、その際にアーキテクトが忘れがちな要素に、テストやリリースのための環境を挙げている。本記事を書いている僕自身の経験にリリースの遅れによって顧客からの不満が上がってきたり、テストのコストが掛かりすぎてリリースが迅速に行えず、機会を逃した経験がある。そのため、このテストとリリースのより良い環境構築の重要性には特に納得させられ、意識づけられた。

「どうやって」よりも「なぜ」

決定された事項に関して、アーキテクトはどうやって構造が機能しているかは解明可能であるが、「なぜ」その決定がなされたかは推測し導き出すことは難しい。だからドキュメントを残すにしろ、アーキテクチャ決定を為すにしろ、なぜその選択をしたかを残し、説明可能にしておくことは重要なのだと理解した。

参考文献

ソフトウェアアーキテクチャの基礎 Mark Richards, Neal Ford 著 島田浩二 訳 2022/3/4 株式会社オライリー・ジャパン

www.oreilly.co.jp

3章 ニューラルネットワーク

また、『ゼロから作るディープラーニング』の勉強まとめ。

 

 

パーセプトロンには長所短所があり、長所は「多層化すれば複雑な関数を表現できるだけの可能性を秘めている」ということ、短所は「そのパラメータを設定するには人手が必要である」ということだ。そしてニューラルネットワークは、その短所を解決するための手法である。

 

パーセプトロンは「ステップ関数」を活性化関数に採用しているが、活性化関数をほかのものにすれば、ニューラルネットワークが実現できる。よく利用されるものに、シグモイド関数がある。

 

シグモイド関数はステップ関数と比較すると、「滑らかさ」が大きく異なるが、この要素がニューラルネットワークの学習において重要である。そして「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の文法にも慣れていないので、そこも意識的にコーディングする。