機能を増やして不足に備える判断と、機能を減らして運用を安定させる判断は、同じ対象に対して繰り返し現れる。ソフトウェアの設計では、未知の要求に対応できるように例外経路を追加することがある。例えば、通常の処理が失敗した場合に別の処理へ切り替える経路や、特定の条件だけに適用する設定を用意する。設計時点では、想定できる失敗や要求をできる限り処理できることが合理的な判断となる。
しかし、運用を始めると、設計時には分からなかった情報が得られる。追加した経路の中には、ほとんど使用されないものがある一方、複数の経路が同じ状態を変更することで、障害の原因を特定しにくくするものもある。分岐が増えれば、動作確認の対象となる組み合わせが増え、修正時に影響を調べる範囲も広がる。運用結果を確認した後では、使用頻度の低い経路を削除したり、同じ処理を行う経路を統合したりする判断が合理的になる。
この二つの判断は、目的が対立しているように見える。前者は機能を増やし、後者は機能を減らすからである。しかし、両者は異なる条件の下で、対象を継続して利用できるようにする判断である。設計時点では未知の要求に対応できない損失が重視され、運用後には実際に観測された障害や維持コストが重視される。構造を評価する条件が変化することで、合理的な更新方向も変化する。整理された構成に新しい要求が到来すれば、再び関係を追加する判断が生じる。
このように、同じ対象が機能を維持しながら、その内部の関係を追加、削除、統合、分解する過程を捉える考え方が構造振動モデルである。概念としての出発点は、未知への備えと運用上の制約が異なる時点で合理性を持ち、構造の更新方向を変化させるという観察にある[1]。ここでいう振動は、物体が一定の周期で往復する運動に限定されない。環境条件や観測結果に応じて、構造が継続的に更新される過程を表している。
構造振動モデルを説明するには、そもそも何を構造と呼ぶのかを定める必要がある。部品の数が同じでも、部品間の接続が異なれば、処理の流れや障害の伝播範囲が異なる場合がある。逆に、部品間の接続を維持したまま、入力の量や種類が変化することで、処理時間やエラーの発生頻度が変化する場合もある。前者は関係構造の変化を含み、後者は構造を維持した状態での動作の変化として説明できる。
この区別を数学的に扱うため、構造振動モデルは、構造を関係グラフとして表し、環境、観測、介入に応じて構造が更新される離散時間の動的システムとして定義されてきた[2]。離散時間とは、構造の状態を時刻 0、時刻 1、時刻 2 という区切られた時点で記録することである。各時点の構造を比較すれば、どの関係が追加され、どの関係が削除されたのかを記述できる。さらに、その変化を数値で表せば、更新の大きさや推移を測定できる。
ただし、構造が更新された事実、更新の大きさ、更新方向、安定性、介入の効果は、それぞれ異なる情報である。ある時点で多くの関係が変更されたことは分かっても、その変更によって運用が安定したかどうかは、変更後の観測結果を調べる必要がある。また、変更後に障害が減少したとしても、同時に利用者数や入力条件が変化していれば、構造更新だけが減少の原因であったとは断定できない。構造の状態、環境条件、観測結果を分けて記録することによって、測定できた事実と、そこから推論する因果関係を区別できる。
1. 構造は関係を維持しながら更新される
四つの部品を持つソフトウェアを考える。最初の部品は要求を受け付け、二つ目の部品は入力が正しいかを検証し、三つ目の部品は要求された処理を実行し、最後の部品は結果を記録する。正しい入力が与えられた場合、要求は受付から入力検証へ進み、検証を通過すると処理が実行され、その結果が記録される。
このシステムを理解するには、四つの部品が存在するという情報に加えて、どの部品からどの部品へ処理が渡されるかを知る必要がある。例えば、結果の記録を担当する部品が存在していても、処理を実行する部品から呼び出されなければ、通常の処理結果は記録されない。部品の一覧が同じであっても、呼び出し関係が異なれば、システム全体の振る舞いに差が生じる。
この関係を簡潔に記述するため、四つの部品に A、B、C、D という記号を割り当てる。A は受付、B は入力検証、C は処理、D は結果の記録を表す。通常の処理では、A から B、B から C、C から D へ処理が渡される。このような要素と関係の集合は、グラフという数学的な対象として表現できる。
時刻 \(t\) における構造を \(S_t\) と書くと、構造振動モデルでは次のように定義する。
\[
S_t=(V_t,E_t,W_t)
\]
ここで、\(t\) は構造を観測する時点を表す。\(V_t\) はその時点に存在する要素の集合、\(E_t\) は要素間の関係の集合、\(W_t\) は関係に付けられた重みである。重みとは、関係の強さやコストなどを数値として表すための値である。例えば、ある部品から別の部品を呼び出す関係が存在するかどうかだけを記録する場合は、存在する関係の重みをすべて 1 としてよい。通信時間を比較する場合には、各関係へ時間を表す数値を割り当てることもできる。
四つの部品を持つ例では、要素の集合と関係の集合を次のように表せる。
\[
V_t=\{A,B,C,D\}
\]
\[
E_t=\{(A,B),(B,C),(C,D)\}
\]
\(V_t\) は A、B、C、D という四つの要素からなる集合である。\(E_t\) に含まれる \((A,B)\) は、A から B へ向かう関係を表す。同様に \((B,C)\) は B から C、\((C,D)\) は C から D への関係である。ここでは関係に向きがあるため、\((A,B)\) と \((B,A)\) は異なる関係として区別する。今回の例では、処理の受け渡し先を表すために、この向きの区別が必要になる。
この構造に、入力検証で拒否された要求を直接記録する機能を追加するとする。従来の構成では、入力検証を通過した要求が処理と記録へ進む。一方、入力検証で拒否された要求については、拒否された事実を記録する経路を新たに設ける。これを実現するため、入力検証 B から記録 D へ直接向かう関係を追加する。
変更後の関係集合は、次のように表せる。
\[
E_{t+1}=E_t\cup\{(B,D)\}
\]
記号 \(\cup\) は、二つの集合に含まれる要素を合わせる操作を表す。右辺は、もともとの関係集合 \(E_t\) に、新しい関係 \((B,D)\) を追加するという意味である。したがって、変更後の関係集合は次のようになる。
\[
E_{t+1}=\{(A,B),(B,C),(C,D),(B,D)\}
\]
この変更では、部品そのものは増えていない。四つの部品はそのまま維持され、呼び出し関係だけが三つから四つへ増えている。要素の集合は \(V_{t+1}=V_t\) である一方、関係の集合は \(E_{t+1}\neq E_t\) となる。これは、構成要素の数を維持したまま構造が更新される具体例である。
新しい経路を追加した直接の理由は、検証に失敗した要求の記録が必要になったことである。その背後には、正常に処理された要求だけを記録する従来の構成では、拒否された要求の発生状況を把握しにくいという運用上の制約がある。入力検証から記録へ向かう経路を追加すると、拒否された要求についても記録を残せるようになる。ただし、その経路を実際に使用するかどうかは入力検証の結果によって決まる。関係が存在することと、個々の要求でその関係が使用されることも区別される。
構造更新を説明する際には、何を一つの要素と数えるかという規則も必要になる。この例では、受付、入力検証、処理、記録をそれぞれ一つの部品として扱った。しかし、入力検証の内部に形式検証、権限検証、値域検証という三つの処理があるなら、それらを個別の要素として記録する方法も考えられる。同じソフトウェアでも、どこまでを一つの要素とするかによって、要素数と関係数は異なる。
例えば、入力検証 B の内部実装を変更して処理時間を短縮した場合を考える。四つの部品間の呼び出し関係だけを記録する規則なら、この変更は関係集合 \(E_t\) の変化として表れない。一方、入力検証の内部に存在する関数とその呼び出し関係まで記録する規則なら、同じ変更が構造の変化として表れる可能性がある。構造が変化したかどうかという判断には、対象をどの粒度で表現しているかという前提が含まれている。
構造の変化と、構造を維持した状態での動作の変化も区別する必要がある。例えば、同じ四つの部品と呼び出し関係を維持したまま、要求の到着数が増えた場合を考える。部品が一秒間に処理できる要求数に上限があれば、要求数の増加によって待ち行列が発生し、応答時間が長くなる場合がある。このとき、処理時間の増大という観測結果が生じていても、部品間の関係集合は維持されている。
反対に、入力検証 B から記録 D への新しい経路を追加しても、正常な入力だけを使った動作確認では、追加前後の出力が同じになる場合がある。新しい経路は入力検証が失敗したときに使用されるため、正常な入力だけを与えている限り、その経路を使用する場面が生じないからである。この場合、構造は更新されているが、選択した入力条件の下では観測結果に差が現れていない。
この区別を整理すると、次のようになる。
| 状況 | 関係構造 | 観測結果 | 判断 |
|---|---|---|---|
| 検証失敗時の記録経路を追加 | B から D への関係を追加する。 | 拒否された要求を記録できるようになる。 | 部品数を維持したまま、関係構造が更新されている。 |
| 同じ構造のまま要求数が増加 | 部品と呼び出し関係を維持する。 | 処理能力を超えた要求が待機し、応答時間が増大する場合がある。 | 環境条件によって観測結果が変化している。 |
| 入力検証の内部処理を変更 | 四つの部品間の呼び出し関係は維持される。 | 検証に必要な処理時間が短縮される場合がある。 | 部品間の関係を記録する粒度では構造は同じだが、内部構造を記録する粒度では変化を検出できる場合がある。 |
| 記録経路を追加した後に正常入力だけを確認 | B から D への関係が追加されている。 | 正常入力では追加前後の処理結果が同じになる場合がある。 | 構造が更新されていても、観測条件によっては出力差が現れない。 |
表の一行目と四行目では、同じ構造更新を異なる観測条件の下で見ている。記録経路の追加という変更は共通しているが、入力検証に失敗する要求を与えた場合には新しい経路を使用し、正常な要求だけを与えた場合には従来の経路を使用する。そのため、観測結果だけから構造更新の有無を判断するには、どの入力条件で観測したかを把握する必要がある。
この関係を数式で表すため、時刻 \(t\) の環境条件を \(C_t\)、観測結果を \(O_t\) とする。環境条件には入力の種類や到着頻度などが含まれ、観測結果には処理時間、エラーの発生数、記録された要求数などが含まれる。構造と環境条件から観測結果が定まる関係を、写像 \(G\) を使って次のように表す。
\[
O_t=G(S_t,C_t)
\]
\(G\) は、構造と環境条件を与えたとき、どのような結果が観測されるかを表す規則である。例えば、構造 \(S_t\) を固定したまま要求の到着頻度を増やせば、環境条件 \(C_t\) が変化する。処理能力を超える要求が継続して到着する場合、待ち時間の増加によって観測結果 \(O_t\) が変化する。この現象は、同じ構造が異なる環境条件に応答する場合として説明できる。
逆に、環境条件を同じに保ったまま呼び出し関係を変更すれば、構造 \(S_t\) が変化する。入力検証で失敗する要求を与えた場合、記録経路の追加前には記録されなかった失敗情報が、追加後には記録されるようになる。この場合、環境条件を固定した比較によって、構造更新に伴う観測結果の差を調べられる。
ただし、異なる構造が同じ観測結果を生む場合もある。正常な入力だけを使った動作確認では、失敗時の記録経路を追加した構造と、追加していない構造が同じ結果を返す可能性がある。つまり、観測結果 \(O_t\) から構造 \(S_t\) を一意に特定できるとは限らない。構造を直接記録する情報と、動作から得られる観測情報を区別する必要がある理由は、この多対一の対応にある。
構造を時刻ごとに比較するためには、要素の識別規則も継続している必要がある。例えば、入力検証 B の名前を変更しただけで別の要素として扱うと、名称の変更が構造の追加や削除として計上される場合がある。同じ部品を異なる時点で同一の要素として追跡できるようにすれば、名称の違いによる見かけ上の変化と、実際の関係の変更を区別できる。
構造の持続性とは、このような識別規則と関係の記録方法を維持しながら、同じ対象を時間に沿って追跡できることである。構造を構成する要素や関係は更新され得るが、更新前後の対応が明確であれば、どの部分が維持され、どの部分が追加または削除されたのかを比較できる。構造振動モデルで扱う時間的な変化は、この比較可能性を前提としている。
四つの部品を持つ例では、入力検証から記録への経路が追加されたことを、関係集合の差として正確に記録できた。また、構造を維持したまま負荷が増加する場合と、構造を変更しても特定の入力条件では結果が同じになる場合を区別できた。構造の状態と観測結果を独立した変数として定義することで、構造更新そのものと、その更新が運用上どのような結果を生んだかを分けて分析できる。
2. 複雑化と単純化は異なる制約から生じる
ソフトウェアの設計段階では、将来発生する要求や障害の全体像を把握することが難しい。ある例外が必要になる可能性は分かっていても、その発生頻度、発生した場合の損失、対策に必要な費用を十分な精度で見積もれるとは限らない。そのため、開発者は未知の要求に備えて例外分岐を追加することがある。この判断は、将来の機能不足や障害への対応遅延を避けるためのものであり、設計時点で利用可能な情報に基づく合理性を持っている。
例えば、入力検証に失敗した要求を記録する経路を追加する場合を考える。通常の入力だけを処理する構成では、入力検証を通過した要求について処理結果を記録できる。しかし、入力検証で拒否された要求については、どのような入力が、どの程度の頻度で拒否されているかを把握しにくい。将来、拒否された要求の調査が必要になると予想されるなら、入力検証から記録へ向かう経路を設けることには合理的な理由がある。
一方、新しい経路を追加すると、その経路自体を維持する費用も発生する。記録処理が失敗した場合の動作を定め、保存先の容量を管理し、機密情報が不適切に記録されないよう確認する必要がある。入力検証と記録処理の間に新しい依存関係が生じれば、記録処理側の障害が入力検証へ影響する可能性も検討しなければならない。構造の複雑化は、対応可能な状況を増やすと同時に、管理すべき関係や障害経路を増やす場合がある。
運用が始まると、設計時には分からなかった情報を取得できる。例外経路が実際に使用された回数、記録された情報が障害調査に利用された回数、経路の維持に必要な作業時間、障害発生時の復旧時間などを測定できる。これらの情報によって、例外経路を保持する利益と維持費用を、設計時の予測より具体的に比較できるようになる。
運用結果によっては、複数の経路を一つに統合した方が合理的になる。例えば、異なる例外に対応するために追加された二つの記録経路が、実際には同じ情報を保存している場合を考える。二つの経路がそれぞれ独立した設定や障害処理を持つなら、修正や動作確認を重複して行う必要が生じる。記録すべき情報と障害時の動作を維持したまま経路を統合できれば、機能を損なわずに管理対象を削減できる。
設計時の複雑化と運用後の単純化は、評価対象となる制約が異なることで生じる。設計時には、未知の要求に対応できないことによる損失が重視される。運用後には、実際の使用頻度や障害記録に基づいて、既存の構造を維持する費用も評価できるようになる。同じ構造について反対方向の更新が選択される理由は、判断に使える情報と、回避すべき損失の組み合わせが変化することにある。
Simon の限定合理性は、判断主体が利用可能な情報と認知能力の制約下で選択を行うことを説明する[3]。設計者が将来の要求を完全に予測できない場合、すべての選択肢について正確な損益を計算することは困難である。そのため、現在把握できる要求、想定される障害、開発期間、利用可能な人員などの条件に基づいて設計を決める。運用によって新しい情報が得られれば、同じ判断を維持する理由も変化し得る。
Hayek は、意思決定に必要な知識が複数の主体に分散していることを論じた[4]。ソフトウェアの開発でも、設計者、運用担当者、利用者が持つ情報は一致しない。設計者は内部の依存関係を詳しく知っていても、利用者がどの機能を頻繁に使用するかを十分に把握していない場合がある。運用担当者は障害の発生状況を把握していても、特定の依存関係が追加された設計上の理由を知らない場合がある。これらの情報が共有されることで、初期設計では判断できなかった構造の変更候補が明らかになる。
このような判断の変化を、簡単な数理モデルで表すことができる。ある例外経路を追加するかどうかについて、一定期間に発生する損失と、その経路を維持する費用を比較する。ここでは、例外経路を追加することで対象の損失を回避できると仮定し、追加によって生じる他の影響は維持費用に含める。
時刻 \(t\) において、対象となる例外が評価期間中に発生する確率を \(p_t\)、その例外に対応できなかった場合の損失を \(L_t\)、例外経路を追加して維持するための同じ期間の費用を \(c_t\) とする。損失と費用は、比較できるように同じ単位へ換算する。
例外経路を設けなかった場合の期待損失は、次のように表せる。
\[
C_{\mathrm{without},t}=p_tL_t
\]
\(C_{\mathrm{without},t}\) は、例外経路が存在しない場合に予想される費用である。例えば、対象期間中に例外が発生する確率が 20% であり、発生した場合の損失が 100 なら、期待損失は \(0.2\times100=20\) となる。期待損失とは、同じ条件で判断を繰り返した場合の平均的な損失を表すものであり、一回の運用で必ず 20 の損失が生じるという意味ではない。
一方、例外経路によって対象の損失を回避できるという仮定の下では、経路を追加した場合の費用は次のようになる。
\[
C_{\mathrm{with},t}=c_t
\]
二つの費用を比較すると、例外経路を追加する方が期待費用を小さくできる条件は、次の不等式で表せる。
\[
c_t<p_tL_t
\]
左辺は例外経路の追加と維持に必要な費用、右辺はその経路によって回避できる期待損失である。回避できる損失の方が大きければ、例外経路を追加することが合理的な選択になる。反対に、維持費用の方が大きければ、例外経路を追加せず、必要になった時点で対応する選択の方が期待費用を小さくできる可能性がある。
例えば、設計段階で \(p_t=0.2\)、\(L_t=100\)、\(c_t=5\) と見積もった場合、期待損失は 20、維持費用は 5 となる。この条件では、例外経路を追加することによって期待費用を 15 だけ削減できる。未知の要求に備えて関係を増やす判断は、このような損失比較によって説明できる。
しかし、運用結果から例外の発生確率について新しい情報が得られ、将来の評価期間に対する推定値が \(p_{t+1}=0.01\) になったとする。損失 \(L_{t+1}=100\)、維持費用 \(c_{t+1}=5\) が同じであれば、例外経路を設けなかった場合の期待損失は \(0.01\times100=1\) となる。
\[
p_{t+1}L_{t+1}=1<5=c_{t+1}
\]
この条件では、例外経路を維持する費用が、その経路によって回避できる期待損失を上回る。経路を安全に削除でき、削除後の対応方法も確保されているなら、構造を単純化する判断が合理的になり得る。初期設計で経路を追加した判断と、運用後に経路を削除する判断は、それぞれの時点で利用可能な情報に基づいて説明できる。
ただし、この計算は例外が評価期間中に発生するかどうかを単一の事象として扱い、その発生による損失が一定であるという単純化を含む。例外が繰り返し発生する場合には発生回数を考慮し、経路によって損失の一部だけを回避できる場合には回避可能な損失を計算する必要がある。また、発生頻度が低くても、一度の障害によって重大な損失が生じるなら、経路の維持が引き続き合理的な場合がある。実際の設計判断では、損失の大きさ、推定の不確実性、安全要件、復旧可能性を合わせて評価する。
この数値例における \(p_t\) は、時刻 \(t\) に得られている情報に基づく将来の発生確率の推定値である。過去の発生割合が、そのまま将来の発生確率になるとは限らない。利用者数、入力の種類、外部システムの状態などが変化すれば、例外の発生条件も変化し得る。さらに、例外経路を追加したことで新しい障害が発生する場合もある。構造を更新した結果が次の判断条件へ影響する点は、構造振動モデルの時間的な性質を理解するうえで欠かせない。
この判断は、期待費用の最小化という一つの評価基準に基づいている。実際の開発では、期待費用が小さくても採用できない設計が存在する。例えば、法令によって記録の保存が義務づけられている場合には、記録頻度の低さだけを理由に経路を削除することはできない。監査可能性、説明責任、安全性などの条件は、費用比較に先立って満たすべき制約として働く。構造を更新する際の合理性は、目的と制約の組み合わせによって定まる。
判断に影響するもう一つの要素は、損失に対する評価である。Kahneman と Tversky のプロスペクト理論は、利得と損失の評価が単純な期待値だけでは表せない場合を示した[5]。例えば、例外への対応漏れによって重大な障害が生じる可能性を強く意識すると、開発者が実際の発生確率以上にその危険を重視する場合がある。ただし、例外経路の追加をすべて損失回避という心理的要因で説明することは適切ではない。実際の障害損失や契約上の責任によって、経路の追加が客観的にも合理的となる場合があるからである。
認知能力の制約も、構造の維持費用に関係する。Sweller の認知負荷研究は、問題解決や学習において、人間が処理できる情報に制約があることを扱っている[6]。この知見をソフトウェアの運用に当てはめて考えると、多数の条件分岐を同時に把握する必要がある設計では、担当者が実行経路や変更の影響を追跡するために多くの認知的資源を必要とすると考えられる。ただし、分岐数と認知負荷の間に普遍的な比例関係が成立するという意味ではない。分岐の独立性、命名、情報の提示方法、担当者の経験なども理解に必要な負担へ影響する。
設計の評価には、利用者が実際に目的を達成できるかという観点も必要になる。Norman の設計論は、設計された仕組みと利用者の行為の関係を考える基礎を与える[7]。人間中心設計を規定する ISO 9241-210 も、利用状況の理解、要求の明確化、設計案の作成、評価という反復的な過程を扱っている[8]。これらは、設計者が想定した利用方法と実際の利用状況との差を把握し、構造を更新する判断に接続できる。
複雑化と単純化を選択する際の条件を整理すると、次のようになる。
| 判断条件 | 関係を増やす方向 | 関係を減らす方向 |
|---|---|---|
| 要求に関する情報 | 未知の要求への備えを優先し、例外経路を保持する。 | 使用頻度が把握された経路を中心に再構成する。 |
| 主なリスク | 機能不足や対応漏れを避ける。 | 衝突、誤操作、変更時の波及を抑える。 |
| 判断に用いる資料 | 想定シナリオ、設計上の制約、事故の想定を用いる。 | 運用記録、障害頻度、復旧時間、維持費用を用いる。 |
| 失敗条件 | 使われない分岐が残り、監視や保守の負担を増やす。 | 必要な例外まで削除し、重要な入力に対応できなくなる。 |
表の二つの更新方向は、異なる評価条件を示している。未知の要求への対応が優先される場合には、追加の経路を保持することに利益がある。一方、実際の利用頻度や保守費用が把握され、既存経路の維持費用が利益を上回る場合には、関係を減らす選択が合理的になる。どちらの方向でも、必要な機能や安全上の制約を維持できることが前提となる。
構造振動モデルでは、このような評価条件の変化を、構造更新の方向を決める要因として捉える。初期設計で未知の要求への備えを重視して関係を増やし、運用結果から維持費用が明らかになれば関係を減らす。さらに、新しい要求や環境の変化によって不足のリスクが増加すれば、再び関係を追加する判断が生じ得る。更新方向が交代する直接の理由は、時間が経過したことではなく、各時点で構造を評価する条件が変化したことである。
ただし、同じ条件を与えれば、すべての構造で同じ更新方向が選択されるというわけではない。例えば、二つのソフトウェアが同じ頻度で例外を観測していても、片方はその例外を他の経路で処理でき、もう片方は専用の経路を必要とする場合がある。この違いは、現在の構造そのものが更新の選択肢と費用を制約していることを意味する。構造更新は、環境条件だけでなく、更新前の構造にも依存する。
この依存関係を整理すると、構造振動モデルにおける更新方向は、現在の構造、環境条件、観測された結果、利用可能な介入の組み合わせによって決まる。複雑化と単純化は、その更新によって生じる構造の変化を特定の尺度で評価したときの方向である。例外経路の追加と削除はその一例であり、同じ考え方は依存関係の統合と分離、権限の集中と分散、処理経路の追加と整理にも適用できる。
構造を評価する尺度が変われば、同じ更新についての判断も変化し得る。例えば、呼び出し関係の数を複雑さの尺度とすれば、経路を一つ追加する操作は複雑化となる。しかし、その追加によって複数の特殊な処理が共通経路へ集約され、例外条件の総数が減少する場合には、別の尺度では単純化と評価される可能性がある。構造の更新方向を数理的に判断するには、何を複雑さとして測定するかを明示する必要がある。
複雑化と単純化の合理性は、更新の向きそのものではなく、各時点の目的、制約、観測情報、維持費用によって評価される。同じ構造に対して異なる方向の更新が選択される現象は、判断の矛盾を意味するとは限らない。環境や観測によって評価条件が更新され、その条件に応じて構造も再編成されるという過程として、一貫して説明できる。
3. 運用観測は構造更新の判断条件を与える
構造を更新する判断には、現在の構造が実際にどのように使われ、どのような結果を生んでいるかという情報が必要になる。設計段階では、将来の要求や障害を予測して関係を追加することが多い。一方、運用開始後には、処理経路の使用頻度、障害の発生状況、復旧に必要な時間、維持作業の負担などを記録できる。これらの観測結果を利用すれば、設計時の想定と実際の運用状況との差を具体的に調べられる。
例えば、十本の例外処理経路を持つソフトウェアを考える。半年間の運用記録を調べたところ、そのうち八本が一度も使用されていなかったとする。この結果だけを見ると、使用されなかった八本を削除すれば、構造を単純化できるように思える。しかし、例外処理経路には、日常的に発生する入力の問題に対応するものもあれば、極めて低い頻度で発生する重大な障害への備えとして設けられたものもある。使用されなかったという事実だけでは、必要性の低い経路と、必要になる事象が発生しなかった経路を区別できない。
例えば、外部の保存先が利用できなくなった場合に、別の保存先へ切り替える経路を考える。半年間に保存先の障害が発生しなければ、切り替え経路が一度も使用されなくても不自然ではない。その経路を削除すると、次に保存先の障害が発生した際には、記録処理を継続できなくなる可能性がある。使用頻度が低いことは経路を削除する判断材料の一つになるが、障害発生時の損失や代替手段の有無も評価する必要がある。
運用記録を解釈する際には、観測期間と観測機会を区別する必要がある。半年間に一度も使用されなかったという情報は、観測期間を示している。しかし、その半年間に対象の例外が発生し得る状況が何回あったのかは、別に確認しなければならない。例えば、対象機能が半年間で十回しか使用されていない場合と、百万回使用されている場合では、例外が観測されなかったことから推定できる発生頻度の範囲が異なる。
この関係を簡単な確率モデルで説明する。ある例外が一回の試行で発生する確率を \(p\)、独立した試行の回数を \(n\) とする。各試行で発生確率が同じであり、一回の試行における発生の有無が他の試行に影響しないと仮定すると、例外が一度も発生しない確率は次のようになる。
\[
P(K=0\mid p,n)=(1-p)^n
\]
\(P\) は確率を表し、\(K\) は観測された例外の発生回数を表す。\(K=0\) は例外が一度も観測されなかった状態であり、右辺の \((1-p)^n\) は、例外が発生しない確率 \(1-p\) が \(n\) 回続く確率を表す。
例えば、一回の試行で例外が発生する確率が 1% であり、対象の試行が 200 回行われたとする。このとき、一度も例外が発生しない確率は次のように計算できる。
\[
P(K=0\mid p=0.01,n=200)
=0.99^{200}
\approx0.134
\]
計算結果は約 13.4% である。実際の発生確率が 1% であっても、200 回の試行で一度も例外を観測しない場合が一定の確率で発生する。観測回数がゼロであることは、発生確率がゼロであることを意味しない。
この計算は、各試行が独立で、発生確率が一定であるという仮定に依存している。実際のソフトウェアでは、障害が連続して発生したり、時間帯や利用者の操作によって発生確率が異なったりすることがある。その場合には、観測機会の数だけでなく、試行間の依存関係や環境条件の違いも考慮する必要がある。また、例外経路が使用されなかった理由が、対象の例外が発生しなかったためなのか、例外の発生を検出できなかったためなのかも区別する必要がある。
観測回数を増やすと、一定の仮定の下では発生確率の推定精度を改善できる。しかし、発生頻度が正確に分かったとしても、その経路を維持するべきかどうかは別の判断になる。必要性を評価するためには、例外の発生によって生じる損失と、経路を維持するための費用を比較する必要がある。
前述の費用比較を例外経路ごとに適用するため、経路の番号を \(i\) とする。評価期間中に対象の例外が発生する確率を \(p_i\)、経路が存在しない場合の損失を \(L_i\)、経路を維持する費用を \(c_i\) とする。さらに、経路によって損失を回避できる割合を \(r_i\) とする。\(r_i=1\) なら対象の損失をすべて回避でき、\(r_i=0.5\) なら半分を回避できるという意味である。
経路を維持した場合の期待費用は、次のように表せる。
\[
C_{\mathrm{keep},i}
=c_i+p_i(1-r_i)L_i
\]
右辺の第一項 \(c_i\) は経路の維持費用である。第二項 \(p_i(1-r_i)L_i\) は、経路を維持しても回避しきれない損失の期待値を表す。例えば、経路によって損失の 80% を回避できるなら、残りの 20% は依然として発生する可能性がある。
一方、その経路を削除し、同じ損失を回避する別の手段が存在しない場合の期待費用は、次のようになる。
\[
C_{\mathrm{remove},i}=p_iL_i
\]
経路を維持した場合の期待費用が、削除した場合より小さくなる条件は、二つの式を比較することで求められる。
\[
c_i+p_i(1-r_i)L_i<p_iL_i
\]
両辺から共通する項を整理すると、次の条件が得られる。
\[
c_i<p_ir_iL_i
\]
右辺の \(p_ir_iL_i\) は、経路を維持することで回避できる期待損失である。維持費用が回避できる期待損失より小さければ、経路を維持する方が期待費用を小さくできる。この条件は、利用回数の少なさだけで削除の合理性が決まるわけではないことを数式で示している。
例えば、ある重大な障害が評価期間中に発生する確率を \(p_i=0.001\)、発生した場合の損失を \(L_i=1000000\)、経路によって損失をすべて回避できる割合を \(r_i=1\)、維持費用を \(c_i=100\) とする。損失と費用には共通の金額単位を用いる。
\[
p_ir_iL_i
=0.001\times1\times1000000
=1000
\]
回避できる期待損失は 1000 となり、維持費用の 100 を上回る。発生確率が 0.1% と低くても、この条件では経路を維持する方が期待費用を小さくできる。低頻度であることと、経路を維持する経済的な合理性が低いことは同義ではない。
反対に、発生確率が \(p_i=0.2\)、損失が \(L_i=10\)、回避割合が \(r_i=1\)、維持費用が \(c_i=100\) であれば、回避できる期待損失は 2 となる。この条件では、経路を削除した方が期待費用は小さくなる。ただし、経路の削除によって他の機能が停止する場合や、法令・契約・安全要件によって経路の維持が義務づけられる場合には、その制約を含めて評価する必要がある。
ここまでの費用比較は、各経路の効果と費用を独立に評価できる場合の単純化である。実際には、二つの例外経路が同じ障害に対応していたり、一方の経路が他方の動作に依存していたりする場合がある。ある経路を削除すると、残された経路の負荷が増え、障害発生確率や維持費用そのものが変化する可能性もある。そのため、経路を個別に評価した結果を単純に合計しても、構造全体の費用を正確に表せるとは限らない。構造全体を評価するには、要素間の依存関係もモデルへ組み込む必要がある。
使用頻度の観測には、もう一つの数理的な側面がある。十本の経路が存在していても、使用状況が均等であるとは限らない。例えば、半年間に例外処理経路が合計 100 回使用され、そのうち 90 回が経路 A、10 回が経路 B、残りの八本は一度も使用されなかったとする。この場合、十本の経路が存在するという情報だけでは、実際の利用が二本の経路に集中していることを表せない。
情報理論では、このような事象の出現分布を情報エントロピーによって定量化できる。Shannon は、事象の確率分布に基づく平均情報量を数学的に定義した[9]。ここでいう情報エントロピーは、どの事象が発生するかを事前に予測する際の不確実性を表す量である。特定の経路に利用が集中している場合と、多数の経路が同じ程度に利用されている場合とでは、この不確実性が異なる。
経路 \(i\) が選択される割合を \(q_i\)、経路の総数を \(m\) とすると、情報エントロピー \(H\) は次のように定義される。
\[
H=-\sum_{i=1}^{m}q_i\log_2q_i
\]
\(\sum\) は、各経路について計算した値を合計する記号である。\(q_i\) は、観測された経路の使用回数の総数に対する、経路 \(i\) の使用回数の割合を表す。すべての経路の割合を足すと 1 になる。 \(\log_2\) は底が 2 の対数であり、この式では情報量をビットという単位で表す。使用割合がゼロの経路については、対応する項を 0 と定義する。
先ほどの例では、十本のうち二本だけが使用されているため、使用割合は \(q_A=0.9\)、\(q_B=0.1\)、残りの八本は \(q_i=0\) となる。したがって、情報エントロピーは次のように計算できる。
\[
H=-0.9\log_2(0.9)-0.1\log_2(0.1)
\approx0.469
\]
この値は約 0.469 ビットである。仮に二本の経路がそれぞれ 50 回ずつ使用されていれば、情報エントロピーは 1 ビットになる。経路 A に使用が集中する場合の方が、次にどちらの経路が使用されるかを予測しやすいため、情報エントロピーが小さくなる。
さらに、十本の経路がすべて同じ割合で使用される場合には、各経路の使用割合は \(q_i=0.1\) となる。このとき、情報エントロピーは次のようになる。
\[
H=-10\times0.1\log_2(0.1)
=\log_2(10)
\approx3.322
\]
十本の経路が均等に使用される場合の方が、二本に利用が集中している場合よりも情報エントロピーは大きい。この比較によって、実際の利用がどの程度の経路に分散しているかを、一つの数値として捉えられる。
ただし、情報エントロピーは経路の使用分布を表す量であり、経路の維持費用や障害時の損失を表す量ではない。八本の経路が一度も使用されなかった場合、その八本は観測された使用分布の情報エントロピーに寄与しない。しかし、重大な障害への備えとして必要な経路であれば、使用分布への寄与がゼロであることは削除の根拠にはならない。情報エントロピーは、観測された利用の集中度を把握するための指標として位置づけられる。
情報エントロピーの計算では、何を一回の観測とするかも重要になる。例えば、一つの要求が複数の例外経路を通過する場合、経路の使用回数を単純に合計すると、要求数より多くなることがある。この場合は、観測対象を「一回の経路通過」とするのか、「一つの要求が通過した経路の組み合わせ」とするのかを決める必要がある。観測単位が異なれば、確率分布も情報エントロピーも異なる。構造更新の判断に情報量を用いる際には、何を事象として数えているかを明確にする必要がある。
複雑さを数値で評価する考え方は、統計モデルの選択にも見られる。あるデータを説明するモデルを選ぶ際、パラメータを増やすと、観測されたデータへの当てはまりを改善できる場合がある。しかし、パラメータを増やしすぎると、観測データに固有の偶然的な変動まで説明しようとし、新しいデータへの予測性能が低下することがある。このような問題に対して、当てはまりとモデルの複雑さを同時に考慮する方法が用いられる。
赤池情報量規準は、その代表的な方法の一つである[10]。一般的に、赤池情報量規準は次のように表される。
\[
\mathrm{AIC}=2k-2\log\hat{L}
\]
\(k\) は統計モデルの推定パラメータ数、\(\hat{L}\) はパラメータを最尤推定したときの尤度である。尤度とは、選択したモデルとパラメータの下で、実際に観測されたデータがどの程度説明されるかを表す量である。ここでの \(\log\) は自然対数を表す。
式の第一項 \(2k\) は、パラメータ数が多いモデルに対して大きくなる。第二項 \(-2\log\hat{L}\) は、データへの当てはまりが改善して尤度が大きくなるほど小さくなる。赤池情報量規準では、これらを合わせて評価し、比較対象となるモデルの中から値が小さいものを選ぶ。この比較には、候補モデルが同じ観測データを対象とし、尤度を適切に定義できることなどの前提がある。
構造振動モデルとの関係で参考になるのは、複雑さを増やすことで得られる利益と、その増加に伴う費用を同時に考慮するという点である。ただし、赤池情報量規準のパラメータ数 \(k\) は、ソフトウェアの部品数や呼び出し関係の数と同じ意味ではない。統計モデルのパラメータ数を数える方法と、ソフトウェアの関係構造を数える方法は異なる。赤池情報量規準を、そのままソフトウェアのエッジ数を減らすための評価式として利用することはできない。
モデルの複雑さを考える別の方法として、Rissanen の最小記述長がある[11]。これは、データを説明するモデルそのものの記述と、そのモデルだけでは説明しきれないデータの記述を合わせて考える方法である。簡単な形では、次のように表せる。
\[
L_{\mathrm{total}}
=L(\mathrm{model})+L(\mathrm{data}\mid\mathrm{model})
\]
\(L_{\mathrm{total}}\) は全体の記述長、\(L(\mathrm{model})\) はモデルを記述するための長さ、\(L(\mathrm{data}\mid\mathrm{model})\) はモデルが与えられた条件でデータを記述するための長さである。ここでの \(L\) は記述長を表す記号であり、前述した障害時の損失 \(L_i\) とは異なる意味で使われている。
複雑なモデルは、さまざまなデータを細かく説明できる場合がある一方、モデルそのものを記述するために多くの情報を必要とする。反対に、単純なモデルは記述量を減らせるが、データの特徴を十分に説明できず、残りの情報を記述するための費用が増える場合がある。最小記述長は、この二つの合計を小さくするという考え方である。
ソフトウェアの例外処理に当てはめると、すべての例外に専用の分岐を用意する構成は、多くの条件を明示的に処理できる一方、分岐そのものを管理する費用が増える可能性がある。共通の処理経路へ統合すれば構造は簡潔になるが、例外ごとに必要な情報を失う場合がある。この対比は、表現の複雑さと説明能力の関係を考えるうえで参考になる。
ただし、最小記述長の原理が扱う符号化上の記述長と、ソフトウェアの運用費用や安全性は同じ量ではない。短いプログラムが必ず保守しやすいとは限らず、呼び出し関係が少ない構造が必ず障害に強いとも限らない。構造の簡潔さを評価するには、何を記述長として測るかという問題に加えて、処理の正確性、障害時の動作、運用上の制約を別に考慮する必要がある。
ここまでの観測と数理的な評価の関係を整理すると、次のようになる。
| 評価対象 | 測定できる内容 | 判断に必要な追加条件 |
|---|---|---|
| 使用回数 | 観測期間中に経路が実際に使用された回数を記録する。 | 観測機会、例外の発生条件、検出漏れの有無を確認する。 |
| 発生確率 | 一定の仮定の下で、将来の例外発生頻度を推定する。 | 試行の独立性、環境条件の安定性、推定の不確実性を考慮する。 |
| 期待損失 | 発生確率と損失額から、評価期間中の平均的な損失を計算する。 | 経路の回避効果、維持費用、安全上の制約、代替手段を確認する。 |
| 情報エントロピー | 観測された経路の使用分布が、どの程度集中または分散しているかを表す。 | 観測単位を固定し、低頻度経路の必要性を別に評価する。 |
| 赤池情報量規準 | 統計モデルの当てはまりとパラメータ数の関係を評価する。 | 適切な尤度と比較可能な候補モデルを定義する。 |
| 最小記述長 | モデルとデータの記述に必要な情報量を合わせて評価する。 | 符号化規則を定め、運用費用や安全性との違いを区別する。 |
| 構造の更新 | 構成要素や関係の追加、削除、統合、分解を記録する。 | 現在の構造、環境、観測結果、介入の目的を関連づける。 |
これらの指標は、互いに異なる対象を測定している。使用回数や発生確率は事象の頻度に関係し、期待損失は発生時の影響を含めて評価する。情報エントロピーは使用分布の不確実性を表し、赤池情報量規準と最小記述長は統計的なモデル選択や情報の記述に関係する。構造の更新そのものは、要素と関係の変化として記録される。各指標の測定対象を区別することで、ある数値が小さいという理由だけで構造の削減を正当化する誤りを避けられる。
構造振動モデルにおける運用観測の役割は、構造更新の判断に必要な情報を与えることである。例えば、例外経路の使用頻度が低くても、障害時の損失が大きく、経路による回避効果が高ければ維持を選択する場合がある。一方、使用頻度が高い経路であっても、別の共通経路へ安全に統合でき、維持費用を削減できるなら、構造の再編成が合理的になる場合がある。同じ使用頻度という観測結果から異なる判断が生じる理由は、現在の構造と、費用、損失、制約条件の組み合わせが異なるためである。
この判断過程を数学的に整理するため、時刻 \(t\) の観測結果を \(O_t\)、環境条件を \(C_t\)、現在の構造を \(S_t\)、構造へ加える介入を \(U_t\) とする。前述した例外発生確率や維持費用の推定値は、観測結果と環境条件に基づいて更新される情報として扱える。構造更新の規則を \(M\) と書けば、次の時点の構造はこれらの情報に依存して定まる。
\[
S_{t+1}=M(S_t,C_t,O_t,U_t)
\]
この式の左辺 \(S_{t+1}\) は更新後の構造、右辺の \(M\) は構造を更新する規則である。\(S_t\) は更新前の構造、\(C_t\) は要求や負荷などの環境条件、\(O_t\) は観測された結果、\(U_t\) は経路の追加や削除などの介入を表す。更新規則 \(M\) は、これらの入力を受け取って次の構造を決定する。例えば、低頻度でも重大な障害を防ぐ経路を維持するという条件を組み込めば、使用回数がゼロであっても経路を削除しない更新規則を定義できる。
ここで、観測結果と更新規則は異なる役割を持つ。観測結果 \(O_t\) は、実際に何が起きたかという情報を与える。一方、更新規則 \(M\) は、その情報を現在の構造や制約条件と組み合わせ、どのような変更を行うかを定める。更新規則が異なれば、同じ観測結果から異なる構造が選択される場合がある。
例えば、ある例外経路が半年間一度も使用されなかったという観測結果に対して、使用頻度だけを重視する更新規則なら削除を選択する可能性がある。一方、重大な障害への備えを優先する更新規則なら維持を選択する可能性がある。どちらの判断が適切かは、障害時の損失、経路の回避効果、維持費用、安全要件などによって決まる。観測結果が同一であっても、評価する条件が異なれば更新後の構造が異なることを、この式は表現できる。
さらに、構造更新は将来の観測結果にも影響する。ある例外経路を削除すると、以後の運用ではその経路の使用回数を観測できなくなる。代替経路へ処理が移れば、代替経路の負荷や障害発生状況が変化する可能性がある。追加した経路が新しい障害を生む場合もある。現在の観測結果に基づく介入が次の構造を形成し、その構造が新しい観測結果を生むという循環が成立する。
構造振動モデルにおいて、複雑化と単純化の交代を生む仕組みは、この循環の中にある。未知の要求への備えとして経路を追加すると、運用から新しい情報が得られる。その情報によって、経路を維持する利益と費用の評価が変化し、統合や削除が選択される場合がある。さらに環境が変化すれば、新しい経路の追加が合理的になる可能性もある。構造の更新方向は、時間の経過そのものによって決まるのではなく、各時点の構造、環境、観測、更新規則によって定まる。
運用観測は、設計時の予測を検証し、構造更新に必要な判断材料を増やす。その情報をどのような規則で評価するかによって、構造を維持する場合も、複雑化させる場合も、単純化させる場合も生じる。構造振動モデルは、この判断と更新の過程を、観測結果から次の構造への状態遷移として統一的に記述する。
4. 構造振動は周期的な往復運動に限定されない
構造振動モデルという名称から、物理学で扱われる振動を連想するかもしれない。例えば、ばねにつながれた物体を引っ張ってから放すと、物体は平衡位置の周辺を往復する。摩擦や抵抗が小さい場合には、この往復運動が一定の周期で繰り返される。物体の位置を時間に沿って測定すれば、平衡位置からの変位、振幅、周期などを数値として表すことができる。
物理学における振動では、物体の位置や速度などの状態が時間とともに変化する。例えば、一定の角振動数で往復する単純な調和振動では、平衡位置からの変位を次のように表せる。
\[
x(t)=a\cos(\omega t+\varphi)
\]
ここで、\(x(t)\) は時刻 \(t\) における変位、\(a\) は最大変位を表す振幅、\(\omega\) は角振動数、\(\varphi\) は初期位相である。角振動数は、振動が時間に対してどの程度の速さで繰り返されるかを表す量である。この式では、物体が一定の周期で同じ位置関係を繰り返すことが、余弦関数によって表現されている。
一方、構造振動モデルで測定する対象は、物体の位置ではなく、構成要素とその関係からなる構造である。例えば、ソフトウェアに処理経路を追加した場合、物理的な位置が移動していなくても、部品間の呼び出し関係が変化する。処理経路を削除した場合も同様に、関係構造が更新される。構造振動モデルでは、こうした時点間の構造差を測定する。
構造の更新は、物理的な調和振動のように一定の時間間隔で発生するとは限らない。ある機能を追加した翌日に障害が判明して削除する場合もあれば、数か月間同じ構成を維持した後、新しい要求に対応するために再び機能を追加する場合もある。さらに、一度複雑化した構造が、次の更新で必ず単純化するという規則も存在しない。複数回の拡張が続く場合や、長期間にわたって更新が停止する場合も考えられる。
この違いを具体的に理解するため、前述した四つの部品 A、B、C、D からなるソフトウェアを再び考える。A は受付、B は入力検証、C は処理、D は結果の記録を担当する。初期構造では、A から B、B から C、C から D へ処理が渡される。
初期状態の関係集合を \(E_0\) とすると、次のように表せる。
\[
E_0=\{(A,B),(B,C),(C,D)\}
\]
ここでは部品間の関係に向きがあり、各関係の重みをすべて 1 とする。構造の比較では、部品の集合と識別規則を固定し、関係の追加と削除だけを対象とする。
時刻 \(t=1\) に、入力検証で拒否された要求を記録する必要が生じ、B から D への経路を追加したとする。更新後の関係集合は次のようになる。
\[
E_1=E_0\cup\{(B,D)\}
\]
この時点で、関係の数は三つから四つへ増加する。時刻 \(t=2\) と \(t=3\) では、同じ構成を維持したとする。その後、時刻 \(t=4\) に記録方式を変更し、B から D への専用経路が不要になったため削除する。時刻 \(t=5\) では変更せず、時刻 \(t=6\) に新しい監査上の要求が生じたため、同じ経路を再び追加するとする。
このとき、各時点の関係集合は次のように表せる。
\[
\begin{aligned}
E_0&=\{(A,B),(B,C),(C,D)\}\\
E_1&=E_0\cup\{(B,D)\}\\
E_2&=E_1\\
E_3&=E_2\\
E_4&=E_0\\
E_5&=E_4\\
E_6&=E_0\cup\{(B,D)\}
\end{aligned}
\]
この例では、最初に経路を追加し、その後二回の観測時点では構造を維持する。続いて経路を削除し、一回の観測時点で構造を維持した後、再び経路を追加している。経路が追加される時刻は 1 と 6 であり、途中の時刻 4 では削除が行われる。更新の間隔は一定ではなく、更新方向も追加と削除の間で交代している。
これらの構造差を数値で把握するため、最も簡単な測定方法として、隣接する二つの時点で追加または削除された関係の本数を数える。関係集合が \(E_t\) と \(E_{t-1}\) であるとき、片方の集合だけに含まれる関係を集めた集合を対称差と呼ぶ。
対称差を記号 \(\triangle\) で表すと、次のように定義できる。
\[
E_t\triangle E_{t-1}
=(E_t\setminus E_{t-1})\cup(E_{t-1}\setminus E_t)
\]
記号 \(\setminus\) は、左側の集合に含まれ、右側の集合には含まれない要素を取り出す操作を表す。右辺の第一項は新しく追加された関係、第二項は削除された関係に対応する。両者を合わせることで、隣接時点間で変更された関係をすべて取り出せる。
対称差に含まれる関係の本数を \(D_t\) とすると、次のように表せる。
\[
D_t=|E_t\triangle E_{t-1}|
\]
縦線 \(|\cdot|\) は、ここでは集合に含まれる要素の個数を表す。例えば、関係が一つ追加された場合は \(D_t=1\)、一つ削除された場合も \(D_t=1\) となる。追加と削除がそれぞれ一つずつ発生した場合は、変更された関係が合計二つあるため \(D_t=2\) となる。
この \(D_t\) は、部品集合と関係の識別規則を固定し、各関係を同じ重みで数える場合の構造変化量である。関係の強さや通信費用などの重みの変化は含めていない。また、部品そのものが追加または削除される場合には、部品の対応関係も含めた別の比較方法が必要になる。
先ほどの例について、各時点の関係数、更新方向、変更された関係の本数を整理すると、次のようになる。
| 時刻 | 構造の状態 | 関係数 | 更新方向 | 構造変化量 \(D_t\) |
|---|---|---|---|---|
| \(t=0\) | 初期構造を記録する。 | 3 | 比較対象となる初期状態である。 | 初期状態のため定義しない。 |
| \(t=1\) | B から D への経路を追加する。 | 4 | 関係が一つ増加する。 | 1 |
| \(t=2\) | 関係を維持する。 | 4 | 変更なし。 | 0 |
| \(t=3\) | 関係を維持する。 | 4 | 変更なし。 | 0 |
| \(t=4\) | B から D への経路を削除する。 | 3 | 関係が一つ減少する。 | 1 |
| \(t=5\) | 関係を維持する。 | 3 | 変更なし。 | 0 |
| \(t=6\) | B から D への経路を再び追加する。 | 4 | 関係が一つ増加する。 | 1 |
この表では、時刻 1、4、6 で構造が更新され、時刻 2、3、5 では構造が維持されている。構造変化量は、関係が追加された場合も削除された場合も 1 となる。つまり、構造変化量からは更新の大きさを把握できるが、それだけでは関係が増えたのか減ったのかを判定できない。
関係の増減方向を表すには、関係数の差を別に計算すればよい。時刻 \(t\) における関係数を \(|E_t|\) とし、その前の時点との差を \(\Delta m_t\) と定義する。
\[
\Delta m_t=|E_t|-|E_{t-1}|
\]
この式では、関係数が増えれば \(\Delta m_t\) は正、減れば負、同じであればゼロになる。先ほどの例では、時刻 1 の更新は \(\Delta m_1=1\)、時刻 4 の更新は \(\Delta m_4=-1\)、時刻 6 の更新は \(\Delta m_6=1\) となる。
構造変化量 \(D_t\) と関係数の差 \(\Delta m_t\) を組み合わせることで、更新の大きさと方向を区別できる。例えば、時刻 1 と時刻 4 はどちらも \(D_t=1\) であるが、前者では関係が追加され、後者では削除されている。構造変化量が同じであることは、同じ方向へ構造が更新されたことを意味しない。
ただし、関係数の差も構造の変化をすべて説明するわけではない。ある関係を一つ削除すると同時に、別の関係を一つ追加した場合、関係数の差はゼロになる。しかし、変更された関係は二つあるため、構造変化量は 2 となる。このような更新では、関係数を維持したまま接続先が再編成されている。構造の複雑さを関係数だけで評価する場合には、この再編成を捉えきれない。
構造振動モデルでは、構造変化量をより一般的に扱うため、構造間の距離を用いる。時刻 \(t\) の構造を \(S_t\)、その直前の構造を \(S_{t-1}\)、両者の距離を表す関数を \(d\) とすると、構造振幅 \(A_t\) は次のように定義される。
\[
A_t=d(S_t,S_{t-1})
\]
ここでいう構造振幅は、隣接する二つの時点の構造がどの程度異なるかを表す非負の量である。構造が同一であれば距離はゼロになり、構造の違いが大きいほど距離が大きくなるような測定方法を選択する。前述の \(D_t\) は、関係の追加と削除だけを数える場合に利用できる具体的な距離の一例である。
物理的な調和振動では、振幅 \(a\) は平衡位置からの最大変位を表す。一方、構造振動モデルの \(A_t\) は、隣接時点間の構造差を表す。両者は同じ「振幅」という名称を持っていても、測定している対象と基準が異なる。例えば、ある構造が同じ方向へ少しずつ変更され続ける場合、各時点の構造振幅は小さくても、初期構造からの累積的な変化は大きくなる可能性がある。
この違いは、単純な数列でも確認できる。構造を一つの数値 \(x_t\) で表すと仮定し、各時点で値が 1 ずつ増える場合を考える。
\[
x_t=t
\]
このとき、隣接時点間の差の絶対値は次のようになる。
\[
A_t=|x_t-x_{t-1}|=1
\]
どの時点でも構造振幅は 1 であり、初期状態からの距離は時間とともに増加する。これは、一方向へ継続的に更新される状態を表している。構造振幅が繰り返し観測されることと、状態が往復運動することは異なる。
反対に、二つの状態を交互に繰り返す場合を考える。
\[
x_t=
\begin{cases}
0 & (t\text{ が偶数})\\
1 & (t\text{ が奇数})
\end{cases}
\]
この場合、状態は 0 と 1 の間を交互に移動し、二つの時点ごとに同じ状態へ戻る。状態の系列には周期性が存在するが、隣接時点間の構造振幅は常に 1 となる。
\[
A_t=|x_t-x_{t-1}|=1
\]
一方向へ増加する数列と、二つの状態を交互に繰り返す数列は、どちらも構造振幅が常に 1 となる。しかし、前者は初期状態から離れ続け、後者は二つの状態を往復している。構造振幅の系列が同じであっても、状態遷移の性質は異なることが分かる。
周期性を数学的に定義するには、構造の状態そのものが一定の間隔で繰り返されるかを調べる。離散時間の構造系列 \(S_t\) について、正の整数 \(T\) が存在し、すべての対象時点で次の関係が成立する場合、その系列は周期 \(T\) を持つ。
\[
S_{t+T}=S_t
\]
\(T\) は状態が繰り返されるまでの時点数を表す。例えば、偶数時点で構造 A、奇数時点で構造 B となる系列では、\(T=2\) が周期になる。ただし、この式の時刻 \(t\) が一定間隔で観測された時点を表す場合に限り、\(T\) を実際の時間の長さへ直接換算できる。
ソフトウェアの構造変更では、観測時点の間隔そのものが一定とは限らない。例えば、時刻 1 と 2 の間が一日であり、時刻 2 と 3 の間が一か月である場合、観測番号が一つ進むことと、同じ時間が経過することは一致しない。そのため、一定の時間周期を持つかどうかを評価するには、構造の状態とともに実際の変更日時も記録する必要がある。
また、有限個の観測結果に同じ構造が繰り返し現れたとしても、将来にわたって同じ間隔で繰り返されることまで確定するわけではない。例えば、先ほどの例では、時刻 0 と 4、時刻 1 と 6 で同じ関係集合が現れる。しかし、それらの一致だけでは、一定の周期が存在すると判断するには情報が足りない。周期性の判定には、観測された状態系列の反復性と、その反復が成立する条件を別に確認する必要がある。
実際の設計判断にも、一定周期を前提としない構造の再編成が現れる。ソフトウェアの構成変更や切り戻しでは、重要な処理経路、観測可能性、縮退運転、退出コストなどを含めて運用の可否が判断されている[12]。例えば、構成を変更した後に障害が増加した場合、変更前の構成へ戻すことがある。しかし、戻した構成が将来にわたって維持される保証はなく、新しい要求や運用上の制約によって再び変更される場合がある。
また、問題の再入や責任境界の再変更などを記録する方法は、構造のどの部分で更新が繰り返されているかを把握するための間接的な指標として利用できる[13]。例えば、ある部品間の責任分担を変更した後、同じ境界で再び調整が必要になる場合、その境界に関係する要求や制約が安定していない可能性がある。ただし、変更回数が多いという観測結果だけで、責任境界の設計に欠陥があると断定することはできない。要求の変化、組織構成の変更、外部制度への対応などによって、同じ境界が繰り返し更新される場合もある。
構造振動モデルで扱う状態遷移には、複数の異なる性質が存在する。それらを整理すると、次のようになる。
| 状態遷移の性質 | 構造の推移 | 確認する条件 |
|---|---|---|
| 一方向の更新 | 関係の追加や削除が、特定の尺度において同じ方向へ継続する。 | 更新方向を表す尺度と、その符号の推移を確認する。 |
| 更新方向の反転 | 関係が増加した後に減少するなど、更新方向が交代する。 | 隣接する更新の方向と、反転が発生した時点を確認する。 |
| 周期的な更新 | 構造の状態が一定の時点間隔で繰り返される。 | 状態系列が周期条件を満たすか確認する。 |
| 更新量の減衰 | 隣接時点間の構造差が次第に小さくなる。 | 構造振幅の推移を測定する。 |
| 構造の収束 | 構造の状態が特定の状態へ近づく。 | 基準となる状態との距離がゼロへ近づくか確認する。 |
| 再励起 | 更新量が小さくなった後、環境や介入によって再び増大する。 | 構造振幅の増加と、その時点の環境条件や介入を確認する。 |
これらの性質は、互いに区別して測定する必要がある。一方向の更新が続く場合にも構造振幅は発生し、周期的な更新では状態が繰り返される。構造振幅が小さくなる場合には更新量の減衰が観測されるが、それだけで特定の状態への収束が保証されるわけではない。構造の安定性を判断するには、構造振幅に加えて、状態の推移や環境条件も確認する必要がある。
構造振動モデルという名称における「振動」は、このような構造の時間的な更新を捉えるための概念である。モデルの基本的な測定対象は、隣接時点間の構造差であり、周期性や更新方向の反転は、その状態遷移に追加して認められる性質である。複雑化と単純化が交代する場合も、一方向の更新が続く場合も、更新が減衰する場合も、同じ構造と状態遷移の定義によって記述できる。
この定義によって、構造の状態、更新の大きさ、更新方向、周期性を混同せずに分析できる。例えば、ソフトウェアの依存関係が繰り返し変更されている場合、最初に各時点の関係構造を記録し、次に隣接時点間の構造差を測定する。そのうえで、変更方向が反転しているか、同じ状態へ戻っているか、更新量が減少しているかを調べられる。構造振動モデルは、こうした性質を区別したうえで、環境条件と観測結果に応じた構造の再編成を一貫した形式で説明する枠組みとなる。
5. 関係構造をグラフとして定義する
構造振動モデルでは、構造が時間とともに更新される過程を数学的に記述する。そのためには、各時点の構造を同じ規則で表現し、更新前後の違いを比較できるようにする必要がある。ソフトウェアの構造を考える場合、部品の数だけでは十分ではない。どの部品がどの部品を呼び出すか、どの部品が別の部品に依存するか、どの経路に処理上の負担が集中しているかといった関係も、システムの性質を決める。
例えば、受付、入力検証、処理、結果の記録という四つの部品を持つソフトウェアを考える。四つの部品が存在することだけを記録しても、要求がどの順序で処理されるかは分からない。受付から入力検証へ進み、検証後に処理が実行され、最後に結果が記録されるという関係を加えることで、システムの処理経路を記述できる。部品を追加せずに呼び出し先を変更した場合も、関係を記録していれば構造の変化として検出できる。
このような要素と関係を表す数学的な対象がグラフである。グラフは、要素を表す点と、要素間の関係を表す線から構成される。点をノード、線をエッジと呼ぶ。例えば、受付を表す点 A と入力検証を表す点 B の間に線を引けば、両者に関係が存在することを表せる。さらに、受付から入力検証へ要求を渡すという方向を区別するなら、A から B へ向かう矢印として関係を表す。
関係に始点と終点の区別があるグラフを有向グラフという。ソフトウェアの呼び出し関係では、A が B を呼び出すことと、B が A を呼び出すことは異なる。前者では A が B の機能を利用し、後者では B が A の機能を利用する。呼び出し方向によって依存関係や障害の影響範囲が異なるため、有向グラフを用いることに意味がある。
さらに、関係には数量的な性質を与えることができる。例えば、部品間の通信に必要な時間、転送されるデータ量、呼び出し頻度などである。関係に数値を割り当てたグラフを重み付きグラフという。構造振動モデルでは、こうした要素、関係、重みを組み合わせ、時刻 \(t\) における構造 \(S_t\) を次のように定義する。
\[
S_t=(V_t,E_t,W_t)
\]
\(t\) は構造を記録する時点である。\(V_t\) はその時点に存在する要素の集合、\(E_t\) は要素間の有向関係の集合、\(W_t\) は各関係に与える重みを表す。例えば、時刻 0 の状態を記録し、構造を変更した後の状態を時刻 1 として記録すれば、\(S_0\) と \(S_1\) を比較することで、更新によって何が変化したかを調べられる。
この定義では、三つの成分が異なる役割を持つ。\(V_t\) は何が存在するか、\(E_t\) は存在する要素がどのように関係しているか、\(W_t\) は関係にどのような数量的性質があるかを表す。例えば、部品を追加すれば要素集合が変化し、既存の部品間に呼び出し経路を追加すれば関係集合が変化する。呼び出し関係を維持したまま通信経路の遅延が変化する場合には、その遅延を重みとして定義していれば、重みの変化として記録できる。
四つの部品を持つ例では、要素の集合を次のように定義する。
\[
V_t=\{A,B,C,D\}
\]
A は受付、B は入力検証、C は処理、D は結果の記録を表す。通常の処理では、A から B、B から C、C から D へ処理が渡されるため、関係集合は次のようになる。
\[
E_t=\{(A,B),(B,C),(C,D)\}
\]
丸括弧で表した \((A,B)\) は、A から B へ向かう有向関係である。同様に、\((B,C)\) は B から C、\((C,D)\) は C から D への関係を表す。ここで、関係は呼び出し可能な接続を表すものとする。実際に個々の要求がその経路を通過したかどうかは、別の観測情報として記録する。
この三つの関係を持つ構造に、入力検証で拒否された要求を直接記録するため、B から D への関係を追加する。更新後の関係集合は次のようになる。
\[
E_{t+1}=\{(A,B),(B,C),(C,D),(B,D)\}
\]
更新前後の要素集合は同一である。
\[
V_{t+1}=V_t
\]
一方、関係集合は異なる。
\[
E_{t+1}\neq E_t
\]
この場合、構成要素の数は四つのままであり、関係の数だけが三つから四つへ増加する。構造振動モデルでは、この変更を関係集合の更新として記録できる。部品数だけを比較していた場合には、同じ変更を検出できない。
グラフの関係を数値として表す方法の一つに、隣接行列がある。隣接行列とは、行と列をそれぞれノードに対応させ、二つのノードの間に関係が存在するかどうかを数値で記録した表である。有向グラフの場合、行を関係の始点、列を関係の終点とする。
ここでは、行と列を A、B、C、D の順序に並べる。隣接行列を \(J_t\) と書き、行番号 \(i\) に対応する要素から列番号 \(j\) に対応する要素へ関係が存在する場合は 1、存在しない場合は 0 とする。
\[
J_t(i,j)=
\begin{cases}
1 & \text{要素 }i\text{ から }j\text{ への関係が存在する場合}\\
0 & \text{関係が存在しない場合}
\end{cases}
\]
ここで \(i\) と \(j\) は、あらかじめ定めた順序における要素の位置を表す。この規則に従うと、更新前の構造は次の行列になる。
\[
J_t=
\begin{pmatrix}
0&1&0&0\\
0&0&1&0\\
0&0&0&1\\
0&0&0&0
\end{pmatrix}
\]
一行目の二列目が 1 であるのは、A から B への関係が存在するためである。二行目の三列目は B から C、三行目の四列目は C から D への関係に対応する。残りの成分は 0 であり、この例で定義した関係が存在しないことを表している。
B から D への関係を追加すると、二行目の四列目が 0 から 1 へ変化する。更新後の隣接行列は次のようになる。
\[
J_{t+1}=
\begin{pmatrix}
0&1&0&0\\
0&0&1&1\\
0&0&0&1\\
0&0&0&0
\end{pmatrix}
\]
二つの行列を比較すると、変更された成分は一つだけである。要素集合と要素の並び順を固定しているため、どの関係が追加されたかを行列の成分から直接確認できる。この表現では、グラフの構造更新を数値の変化として扱える。
ただし、隣接行列の形だけでは、要素の意味までは分からない。例えば、A と B の並び順を入れ替えると、同じグラフでも行列中の 1 の配置が変化する。これは構造の変更による差ではなく、表現上の順序を変更したことによる差である。そのため、異なる時点の隣接行列を直接比較する場合には、ノードの識別子と並び順を一致させる必要がある。
関係が存在するかどうかに加え、関係ごとの数量的な性質を記録したい場合には、重みを定義する。重みは、関係集合 \(E_t\) に含まれる各関係へ数値を割り当てる規則として表せる。
\[
W_t:E_t\rightarrow\mathbb{R}
\]
\(\mathbb{R}\) は実数の集合である。この式は、関係集合に含まれる各関係を入力すると、その関係に対応する実数値が得られることを意味する。実際の重みの取り得る範囲は、測定対象によって定める。例えば通信時間を重みとする場合には、負の通信時間を想定しないため、重みは非負の値となる。
例えば、A から B への通信時間が 1 ミリ秒、B から C への通信時間が 2 ミリ秒、C から D への通信時間が 4 ミリ秒であるとする。この場合、重みは次のように定義できる。
\[
\begin{aligned}
W_t(A,B)&=1\\
W_t(B,C)&=2\\
W_t(C,D)&=4
\end{aligned}
\]
これらの重みは、すべて通信時間をミリ秒単位で表している。関係の存在だけを記録する場合には各重みを 1 としてよいが、通信時間を比較する場合には実測値や測定方法に基づく重みを使用する。何を重みとするかによって、同じ関係構造でも異なる数値表現が得られる。
例えば、B から C への通信時間が 2 ミリ秒から 5 ミリ秒へ増加したとする。呼び出し関係そのものは維持されているため、要素集合 \(V_t\) と関係集合 \(E_t\) は変化しない。しかし、通信時間を重みとして定義していれば、重みが変化する。
\[
W_{t+1}(B,C)=5
\]
このとき、重みを含む構造 \(S_t=(V_t,E_t,W_t)\) は更新前後で異なる。通信時間を構造の属性として扱う定義では、関係の接続を維持したまま、重みが変化した状態として記録できる。一方、通信時間を運用結果として観測する定義では、通信時間の増加を観測値の変化として扱う。同じ測定値であっても、構造の属性として定義するか、運用の結果として定義するかによって、モデル上の位置づけが異なる。
例えば、通信時間が負荷によって変動する場合を考える。部品間の接続や通信方式を維持したまま要求数が増加し、通信時間が長くなったのであれば、その変化を環境条件と観測結果の関係として説明する方法がある。反対に、通信経路の帯域や通信方式を変更したことで通信時間の特性が変化したのであれば、構造に付随する重みの更新として表現する方法もある。構造と観測の境界は、モデル化の目的に応じて明示する必要がある。
異なる性質を表す数値を同じ重みとして使用する場合には、単位の違いにも注意が必要である。例えば、ある関係の重みを通信時間のミリ秒、別の関係の重みを転送量のバイトとして定義した場合、それらの数値を直接比較しても意味が定まらない。通信時間が 10 ミリ秒の関係と、転送量が 10 バイトの関係は、数値が等しいという理由で同じ性質を持つわけではない。
複数の性質を同時に測定する場合には、通信時間、転送量、呼び出し頻度などを別々の属性として保持する方法が考えられる。必要に応じて、それぞれの値を基準値で割るなどして無次元化し、比較に使用することもできる。ただし、その場合にも基準値と重みづけの根拠を明示する必要がある。異なる単位を持つ値をどのように統合するかによって、構造の比較結果が変化するためである。
グラフの数値的な性質を調べる方法には、ノード数やエッジ数を数える方法のほかに、接続密度や固有値などを調べる方法がある。グラフのスペクトルを用いる研究では、グラフに対応する行列の固有値などを通じて、接続構造の性質を分析する[14]。ただし、どの行列を使うかによって測定できる性質は異なるため、構造の比較目的に合わせて指標を選択する必要がある。
例えば、エッジ数は関係の総数を表す最も単純な指標である。時刻 \(t\) の関係集合を \(E_t\) とすると、エッジ数は \(|E_t|\) と表せる。先ほどの例では、更新前のエッジ数は 3、更新後は 4 である。関係の追加によってエッジ数が増えたことは、この指標だけで確認できる。
しかし、エッジ数が同じでも、接続の配置が異なれば構造は異なる。例えば、次の二つの関係集合を考える。
\[
E^{(1)}=\{(A,B),(B,C),(C,D)\}
\]
\[
E^{(2)}=\{(A,B),(B,D),(C,D)\}
\]
どちらも関係の数は三つである。
\[
|E^{(1)}|=|E^{(2)}|=3
\]
しかし、第一の構造では B から C へ処理が渡され、第二の構造では B から D へ直接処理が渡される。両者はエッジ数が同じでも、呼び出し経路が異なる。関係数だけを比較すれば変化はゼロとなるが、関係集合そのものを比較すれば、\((B,C)\) の削除と \((B,D)\) の追加を確認できる。
接続密度も、関係の配置を完全には表さない指標の一つである。接続密度とは、存在し得る関係の総数に対して、実際に存在する関係がどの程度の割合を占めるかを表す量である。自己ループを持たない単純な有向グラフでは、ノード数を \(n\)、エッジ数を \(m\) とすると、接続密度 \(\rho\) は次のように定義できる。
\[
\rho=\frac{m}{n(n-1)}
\]
自己ループとは、あるノードから同じノード自身へ向かう関係である。ここでは自己ループを含めず、同じ始点と終点を持つ関係を重複して数えない。ノードが \(n\) 個あるとき、各ノードは自分自身を除く \(n-1\) 個のノードへ向かう関係を持ち得るため、存在し得る有向関係の総数は \(n(n-1)\) となる。
四つの部品を持つ例では、\(n=4\) である。自己ループを除いた関係の候補は \(4\times3=12\) 通りとなる。更新前のエッジ数が 3 であれば、接続密度は次のようになる。
\[
\rho_t=\frac{3}{4(4-1)}=\frac{3}{12}=0.25
\]
B から D への経路を追加してエッジ数が 4 になれば、接続密度は次のようになる。
\[
\rho_{t+1}=\frac{4}{12}\approx0.333
\]
この例では、関係の追加によって接続密度が 0.25 から約 0.333 へ増加している。接続密度を用いれば、ノード数が異なるグラフについても、存在し得る関係に対する割合を比較できる。ただし、接続密度が同じでもエッジの配置は異なり得る。また、接続密度が大きいことが、必ずしも障害リスクや運用費用の増大を意味するわけではない。実際の影響は、どの要素が接続され、各関係がどのような役割を持つかによって決まる。
グラフを比較するときには、どこまでを一つのノードとして表すかという粒度も重要になる。例えば、入力検証 B の内部に、形式検証、権限検証、値域検証という三つの処理があるとする。これらを一つの入力検証部品 B として表せば、グラフには一つのノードが置かれる。一方、三つの処理を別々のノードとして表せば、ノード数が増え、処理間の呼び出し関係もエッジとして記録される。
この二つの表現は、同じソフトウェアを異なる粒度で記録したものである。細かい粒度を採用すると、内部の処理経路の変化を検出しやすくなる。一方、粗い粒度では、主要な部品間の関係を簡潔に把握できる。どちらの粒度が適切かは、構造振動モデルで何を分析したいかによって決まる。例えば、システム全体の部品間依存を分析する場合と、入力検証内部の責任分担を分析する場合では、必要な粒度が異なる。
粒度の選択は、構造変化量の測定結果にも影響する。入力検証 B の内部で二つの関数の呼び出し関係が変更された場合、B を一つのノードとする表現では、その変更を検出できないことがある。一方、内部の関数を個別のノードとする表現では、エッジの変更として記録できる。構造の違いを検出できる範囲は、最初に採用した表現規則によって制約される。
さらに、異なる時点のグラフを比較するには、ノードの同一性を判断する規則が必要になる。例えば、入力検証 B という部品の名称を変更しただけで、新しいノードとして扱う規則を採用している場合、名称変更によって古いノードの削除と新しいノードの追加が発生したように見える。しかし、内部の役割と呼び出し関係が維持されているなら、名称だけの変更を構造の変更として数えることは、分析目的によっては適切ではない。
同じ部品を時刻を通じて追跡するためには、名称とは独立した識別子を与える方法が考えられる。例えば、入力検証を担当する部品に継続的な識別子を割り当て、名称変更後も同じ識別子で記録する。この方法なら、名称の変更と関係構造の更新を区別できる。
ただし、同じ識別子を持つ部品であっても、内部の役割が大きく変更される場合がある。例えば、入力検証を担当していた部品が、変更後には権限判定も担当するようになったとする。この場合、ノードの識別子を維持していても、部品の責務は変化している。責務の変化を構造の一部として測定したいなら、ノードに属性を与えるか、責務を別のノードや関係として表現する必要がある。
グラフを測定可能な構造として利用するための条件を整理すると、次のようになる。
| 定義する対象 | 記録する内容 | 定義が曖昧な場合の影響 |
|---|---|---|
| ノード | 構成要素の単位と、要素を区別する識別子を定める。 | 同じ対象でも、分割の粒度によってノード数が異なる。 |
| エッジ | 呼び出し、依存、通信など、記録対象となる関係を定める。 | 異なる種類の関係が混在し、構造差の意味が不明確になる。 |
| 方向 | 関係の始点と終点を区別する必要があるかを定める。 | 依存方向や処理の受け渡し方向を区別できなくなる。 |
| 重み | 関係に割り当てる数量、測定単位、測定方法を定める。 | 異なる数量を同じ尺度として比較してしまう。 |
| 粒度 | 部品単位、関数単位、処理単位など、構造を記録する範囲を定める。 | 表現の粗さによって、実際の変更を検出できない場合がある。 |
| 時間的な対応 | 更新前後のノードと関係を、同じ対象として追跡する規則を定める。 | 名称変更や識別子の付け替えが構造変更として計上される。 |
| 構造と観測の境界 | 構造の属性として保持する値と、運用結果として測定する値を区別する。 | 同じ現象を構造更新と観測結果の変化の両方として数える可能性がある。 |
これらの規則を定めることで、異なる時点の構造を比較するための前提が整う。例えば、同じ四つの部品を対象として、呼び出し可能な関係の追加と削除だけを測定するなら、ノードの識別子を固定し、エッジの存在を 0 と 1 で表す方法を採用できる。通信時間も分析する場合には、関係の存在と通信時間を別々に記録すれば、接続の変更と通信特性の変化を区別できる。
一方、複数のソフトウェアや異なる設計段階を比較する場合には、ノード数や粒度が異なることもある。例えば、更新前には入力検証を一つの部品として扱い、更新後には形式検証と権限検証の二つに分離した場合、単純に隣接行列の成分を比較するだけでは、どの要素が分離されたのかを判断できない。構造の分割や統合を追跡するには、更新前後の要素間の対応関係を記録する必要がある。
また、グラフの表現規則を固定していても、構造を要約する指標の選択によって、検出できる違いは異なる。エッジ数だけを記録すれば、関係の追加や削除による総数の変化は分かる。しかし、同じ数のエッジを別の接続先へ付け替えた場合、その違いを検出するには関係集合そのものを比較する必要がある。ノードやエッジの数値的な特徴を利用する場合にも、どの特徴を残し、どの情報を省略するかが測定結果に影響する。
構造振動モデルでは、構造を \(S_t=(V_t,E_t,W_t)\) と定義することで、要素、関係、重みを共通の形式で記録できる。さらに、時刻ごとの識別規則と表現粒度を明確にすれば、構造の持続と更新を比較可能な対象として扱える。構造をどのようなグラフで表現するかは、その後に測定される構造差の意味を決める前提となる。
この定義の下では、構造の複雑化をエッジ数の増加として測ることも、接続密度の増加として測ることもできる。ただし、両者は同じ指標ではない。また、同じエッジ数や接続密度を持つ二つのグラフでも、関係の配置が異なる場合がある。構造の更新を正確に捉えるためには、分析対象に必要な情報を保持し、その情報に対応した比較方法を選択する必要がある。
構造振動モデルにおけるグラフの定義は、構造を固定された図として示すためだけのものではない。各時点の構造を同じ規則で記録し、要素、関係、重みのどこに変更が生じたかを数学的に識別するための基盤である。この基盤によって、構造更新を単なる印象や比喩として記述する段階から、具体的な差を測定して比較する段階へ進める。
6. 埋め込みと距離によって構造差を測定する
関係構造をグラフとして定義すると、各時点に存在する要素と関係を記録できる。しかし、二つのグラフを比較するには、どの違いを測定し、その違いをどのような数値で表すかを定める必要がある。例えば、ソフトウェアの呼び出し関係を一つ追加した場合と、三つの呼び出し関係を変更した場合では、構造の更新量が異なると考えられる。一方、関係の数が同じであっても、接続先が変更されていれば、構造には違いが存在する。
グラフの違いを測定する方法は一つに限られない。要素や関係の追加と削除を数える方法もあれば、グラフ全体の接続傾向を数値化する方法もある。どの方法を選ぶかによって、同じ構造更新に対して得られる数値が異なる。構造振動モデルで構造の変化量を測定するためには、比較対象となる構造の集合、数値への変換規則、変換後の数値を比較する方法を順に定義する必要がある。
6.1. 構造をベクトルとして表現する
グラフは、ノードとエッジの集合によって表される。しかし、時間とともにノードやエッジが追加または削除される場合、各時点のグラフをそのまま数値の列として比較することは難しい。例えば、ある時点では三つの関係が存在し、別の時点では四つの関係が存在する場合、単純に存在する関係の重みだけを並べると、数値の列の長さが異なってしまう。
この問題に対応する方法の一つが、構造を一定の規則に従って数値の列へ変換することである。複数の数値を順序を決めて並べたものをベクトルと呼ぶ。例えば、三つの数値を並べた \((1,0,1)\) は三次元のベクトルであり、六つの数値を並べた \((1,0,1,0,1,0)\) は六次元のベクトルである。
構造をベクトルへ変換する規則を、ここでは埋め込み写像と呼ぶ。比較対象となる構造の集合を \(\mathcal{S}\)、埋め込み写像を \(\phi\) とすると、次のように定義できる。
\[
\phi:\mathcal{S}\to\mathbb{R}^{n}
\]
\(\mathcal{S}\) は、比較対象として認める構造の集合である。\(\mathbb{R}^{n}\) は、\(n\) 個の実数を並べたベクトルの集合を表す。\(n\) はベクトルの成分数であり、次元と呼ばれる。\(\phi\) は、構造を入力として受け取り、あらかじめ定めた規則で \(n\) 個の数値を返す写像である。
時刻 \(t\) における構造を \(S_t\) とすると、対応するベクトルを次のように表せる。
\[
x_t=\phi(S_t)
\]
\(x_t\) は時刻 \(t\) の構造を数値化したベクトルである。この式によって、ノードとエッジからなる構造を、数値計算に使用できる形式へ変換する。比較する時点が異なっていても、同じ埋め込み写像を使用すれば、各時点の構造を共通の数値空間で表せる。
ただし、構造をベクトルに変換しただけでは、どの情報が保持されるかは定まらない。ノード数とエッジ数だけを記録する方法もあれば、個々のエッジの有無を記録する方法もある。さらに、エッジの重みやノード間の経路の長さを記録する方法も考えられる。埋め込み写像は、構造からどの特徴を取り出すかという選択を含んでいる。
6.2. エッジの有無を六次元ベクトルで表す
具体例として、受付 A、入力検証 B、処理 C、結果の記録 D からなる四つの部品を考える。この例では、部品の集合を固定し、呼び出し関係の追加と削除だけを測定する。各関係には向きがあり、関係が存在する場合は 1、存在しない場合は 0 として記録する。
四つのノードを持つ自己ループのない有向グラフでは、始点と終点の組み合わせは全部で \(4\times3=12\) 通り存在する。ただし、今回の例では、設計上比較対象となる関係を次の六つに限定する。
\[
\begin{aligned}
e_1&=(A,B)\\
e_2&=(A,C)\\
e_3&=(B,C)\\
e_4&=(B,D)\\
e_5&=(C,D)\\
e_6&=(A,D)
\end{aligned}
\]
\(e_1\) から \(e_6\) は、比較対象として選んだ六つの有向関係である。例えば、\(e_1\) は受付 A から入力検証 B へ向かう関係、\(e_4\) は入力検証 B から記録 D へ向かう関係を表す。六つの候補を選ぶのは計算例を簡潔にするためであり、一般的な有向グラフの関係候補が六つに限られるという意味ではない。
各関係が存在するかどうかを、\(e_1,e_2,e_3,e_4,e_5,e_6\) の順に並べる。例えば、関係集合が次のように与えられているとする。
\[
E_0=\{(A,B),(B,C),(C,D)\}
\]
この構造では、\(e_1\)、\(e_3\)、\(e_5\) が存在し、\(e_2\)、\(e_4\)、\(e_6\) は存在しない。存在する関係に 1、存在しない関係に 0 を割り当てると、次の六次元ベクトルが得られる。
\[
x_0=(1,0,1,0,1,0)
\]
左から一番目の 1 は A から B への関係、三番目の 1 は B から C への関係、五番目の 1 は C から D への関係に対応する。残りの成分は、対応する関係が存在しないことを表している。
次に、入力検証で拒否された要求を直接記録するため、B から D への経路を追加する。更新後の関係集合は次のようになる。
\[
E_1=\{(A,B),(B,C),(B,D),(C,D)\}
\]
この場合、四番目の関係 \(e_4=(B,D)\) が新たに存在するため、更新後のベクトルは次のようになる。
\[
x_1=(1,0,1,1,1,0)
\]
更新前後のベクトルを比較すると、四番目の成分だけが 0 から 1 へ変化している。グラフの関係を追加した操作が、ベクトルの一つの成分の変化として記録されたことになる。
さらに、処理経路を再構成し、B から C への関係を削除する代わりに、A から C への関係を追加したとする。B から D への関係は維持する。このときの関係集合を次のように置く。
\[
E_2=\{(A,B),(A,C),(B,D),(C,D)\}
\]
対応するベクトルは次のようになる。
\[
x_2=(1,1,0,1,1,0)
\]
この変更では、二番目の成分が 0 から 1 へ変化し、三番目の成分が 1 から 0 へ変化している。エッジ数は四つのままであるが、二つの関係が変更されている。エッジ数だけを比較する場合には検出できない構造差を、六次元ベクトルでは記録できる。
三つの構造を整理すると、次のようになる。
| 構造 | 関係集合 | 埋め込みベクトル | エッジ数 |
|---|---|---|---|
| \(S_0\) | \((A,B),(B,C),(C,D)\) が存在する。 | \((1,0,1,0,1,0)\) | 3 |
| \(S_1\) | \((A,B),(B,C),(B,D),(C,D)\) が存在する。 | \((1,0,1,1,1,0)\) | 4 |
| \(S_2\) | \((A,B),(A,C),(B,D),(C,D)\) が存在する。 | \((1,1,0,1,1,0)\) | 4 |
この例では、どの時点でも同じ六つの関係候補を同じ順序で並べている。関係が追加または削除されてもベクトルの長さは変化しない。そのため、各成分を対応させて比較できる。埋め込み写像を固定することは、異なる時点の構造を同じ尺度で測定するための条件となる。
6.3. ユークリッド距離によって構造差を測定する
構造をベクトルとして表現すると、二つの構造がどの程度異なるかを数値で計算できる。ここでは、ベクトル間の距離としてユークリッド距離を使用する。ユークリッド距離は、平面上の二点間の直線距離を、より多くの次元へ拡張したものである。
例えば、平面上に \((1,2)\) と \((4,6)\) という二点がある場合、横方向の差は 3、縦方向の差は 4 である。三平方の定理によって、二点間の距離は \(\sqrt{3^2+4^2}=5\) となる。ユークリッド距離は、各成分の差を二乗して合計し、その平方根を取ることで求められる。
二つの構造 \(S_a\) と \(S_b\) の埋め込みベクトルを、それぞれ \(x_a=\phi(S_a)\)、\(x_b=\phi(S_b)\) とする。これらの構造間距離を、次のように定義する。
\[
d(S_a,S_b)=\|\phi(S_a)-\phi(S_b)\|_2
\]
\(d(S_a,S_b)\) は構造 \(S_a\) と \(S_b\) の間の距離である。\(\|\cdot\|_2\) はユークリッドノルムを表す記号であり、ベクトルの各成分を二乗して合計し、その平方根を取る操作を意味する。二つのベクトルがそれぞれ \(n\) 個の成分を持つ場合、この距離は次のように計算できる。
\[
d(S_a,S_b)
=\sqrt{\sum_{i=1}^{n}(x_{a,i}-x_{b,i})^2}
\]
\(x_{a,i}\) はベクトル \(x_a\) の \(i\) 番目の成分、\(x_{b,i}\) はベクトル \(x_b\) の \(i\) 番目の成分である。二つの構造の対応する成分を引き算し、その結果を二乗する。\(i=1\) から \(n\) までの結果を合計して平方根を取ることで、構造間距離が得られる。
実際に、先ほどの \(S_0\) と \(S_1\) の距離を計算する。
\[
\begin{aligned}
x_0&=(1,0,1,0,1,0)\\
x_1&=(1,0,1,1,1,0)
\end{aligned}
\]
二つのベクトルの差は、次のようになる。
\[
x_1-x_0=(0,0,0,1,0,0)
\]
四番目の成分だけが 1 となり、それ以外はすべて 0 である。したがって、ユークリッド距離は次のように求められる。
\[
\begin{aligned}
d(S_0,S_1)
&=\sqrt{0^2+0^2+0^2+1^2+0^2+0^2}\\
&=\sqrt{1}\\
&=1
\end{aligned}
\]
この距離が 1 となるのは、比較対象となる六つの関係のうち、一つだけが異なっているためである。関係を一つ追加したことが、距離 1 として表現される。
続いて、\(S_1\) と \(S_2\) の距離を計算する。
\[
\begin{aligned}
x_1&=(1,0,1,1,1,0)\\
x_2&=(1,1,0,1,1,0)
\end{aligned}
\]
二つのベクトルの差は、次のようになる。
\[
x_2-x_1=(0,1,-1,0,0,0)
\]
二番目の成分は 0 から 1 へ変化したため差が 1、三番目の成分は 1 から 0 へ変化したため差が -1 となる。その他の関係は維持されているため、差は 0 である。
\[
\begin{aligned}
d(S_1,S_2)
&=\sqrt{0^2+1^2+(-1)^2+0^2+0^2+0^2}\\
&=\sqrt{2}\\
&\approx1.414
\end{aligned}
\]
この距離は約 1.414 となる。\(S_0\) から \(S_1\) への変更では一つの関係が追加され、\(S_1\) から \(S_2\) への変更では一つの関係が追加されると同時に、別の関係が削除された。後者では変更された成分が二つあるため、距離が大きくなっている。
両者の距離を比較すると、次の関係が成立する。
\[
d(S_0,S_1)=1<\sqrt{2}=d(S_1,S_2)
\]
この結果は、今回採用した六つの関係候補と、エッジの有無を 0 と 1 で表す埋め込み写像の下で成立する。すべての関係を同じ尺度で評価しているため、変更された関係の本数が距離の大きさへ反映されている。
6.4. エッジの変更本数とユークリッド距離の関係
エッジの有無を 0 と 1 で表す場合、ユークリッド距離には単純な性質がある。二つの構造で同じ状態のエッジについては、成分の差が 0 になる。一方、片方にだけ存在するエッジについては、成分の差が 1 または -1 になる。
いずれの場合も、成分の差を二乗すると、同じ状態のエッジは 0、異なる状態のエッジは 1 となる。そのため、各成分の差の二乗を合計すると、追加または削除されたエッジの本数に一致する。
変更されたエッジの本数を \(D(S_a,S_b)\) とすると、次のように表せる。
\[
D(S_a,S_b)=|E_a\triangle E_b|
\]
\(\triangle\) は集合の対称差を表す。二つの集合のうち、片方だけに含まれる要素を集める操作である。この場合は、二つの構造の間で追加または削除されたエッジを集めることに対応する。縦線 \(|\cdot|\) は、その集合に含まれるエッジの本数を表す。
エッジの有無を表す二値ベクトルでは、次の関係が成立する。
\[
d(S_a,S_b)^2=D(S_a,S_b)
\]
したがって、ユークリッド距離は次のようにも書ける。
\[
d(S_a,S_b)=\sqrt{D(S_a,S_b)}
\]
例えば、変更されたエッジが一本なら距離は 1、二本なら \(\sqrt{2}\)、三本なら \(\sqrt{3}\)、四本なら 2 となる。変更されたエッジの本数が増えれば、ユークリッド距離も増加する。ただし、平方根を取るため、距離の値は変更本数に比例するわけではない。
前述した三つの構造について、変更されたエッジの本数とユークリッド距離を整理すると、次のようになる。
| 比較対象 | 変更されたエッジ | 変更本数 | ユークリッド距離 |
|---|---|---|---|
| \(S_0\) と \(S_1\) | \((B,D)\) の追加。 | 1 | \(1\) |
| \(S_1\) と \(S_2\) | \((B,C)\) の削除と \((A,C)\) の追加。 | 2 | \(\sqrt{2}\approx1.414\) |
| \(S_0\) と \(S_2\) | \((B,C)\) の削除、\((A,C)\) と \((B,D)\) の追加。 | 3 | \(\sqrt{3}\approx1.732\) |
この表では、\(S_0\) から \(S_2\) へ直接比較した場合に、三つのエッジが異なることも確認できる。一方、\(S_0\) から \(S_1\)、\(S_1\) から \(S_2\) という二回の更新を経由した場合には、それぞれの時点間の距離を別々に測定できる。初期状態からの距離と、各更新時点における距離は異なる情報を表す。
なお、変更本数 \(D\) とユークリッド距離 \(d\) は、どちらも構造差を測定するが、数値の尺度は異なる。変更本数は変更されたエッジを直接数え、ユークリッド距離はその平方根を取る。どちらを採用する場合も、計算に用いた定義を明示すれば比較できる。構造振動モデルで用いる構造振幅は、採用した構造間距離に基づいて定まるため、距離の選択は振幅の数値にも影響する。
6.5. グラフ編集距離との関係
エッジの有無を固定長のベクトルで表す方法は、ノードの集合と識別規則が固定されている場合に利用しやすい。しかし、実際のソフトウェアでは、部品が追加されたり、複数の部品が統合されたりする場合がある。そのような場合、すべての時点で同じノード集合を維持する方法だけでは、構造の更新を十分に表現できないことがある。
異なるグラフを比較する方法の一つに、グラフ編集距離がある。これは、一方のグラフをもう一方のグラフへ変換するために必要な編集操作の費用を求める方法である。編集操作には、ノードの追加や削除、エッジの追加や削除、ノードやエッジの属性変更などを含めることができる。どの操作を認め、各操作へどのような費用を割り当てるかによって、得られる距離は異なる。こうした定義と計算方法は、グラフ編集距離の研究で扱われている[15]。
例えば、エッジを一本追加する費用を 1、エッジを一本削除する費用を 1 とする。ノード集合を固定し、エッジの追加と削除だけを認める場合、二つのグラフを一致させるために必要な編集費用は、変更されたエッジの本数に一致する。
先ほどの \(S_1\) と \(S_2\) では、\((B,C)\) を削除し、\((A,C)\) を追加すれば構造が一致する。そのため、この規則による編集費用は 2 となる。
\[
D_{\mathrm{edit}}(S_1,S_2)=1+1=2
\]
一方、同じ二つの構造を二値ベクトルのユークリッド距離で比較すると、結果は \(\sqrt{2}\) となる。編集費用が 2 であることと、ユークリッド距離が約 1.414 であることは矛盾しない。両者は構造差を異なる規則で数値化しているためである。
さらに、エッジの変更費用を一律に 1 とせず、重要な処理経路の削除には大きな費用を与える方法も考えられる。例えば、通常の監視経路を削除する費用を 1、重要な記録経路を削除する費用を 10 とすれば、同じ一本のエッジ削除でも、編集距離への寄与は異なる。
ただし、この費用は分析者が定義した評価規則である。重要な経路へ大きな費用を割り当てれば、その経路の変更が構造差に大きく反映される。実際の障害損失や復旧費用を反映させたい場合には、それらの値をどのように測定し、編集費用へ対応づけるかを定める必要がある。
グラフ編集距離では、ノードの対応づけも問題になる。例えば、更新前後で部品の名称が変更されていても、同じ役割を持つ部品として対応づける場合がある。逆に、名前が同じでも責務が変化した場合には、属性の変更として費用を計算することも考えられる。どのノードを同一と認めるかによって必要な編集操作が異なるため、比較するグラフの識別規則と編集操作の定義が重要になる。
6.6. 埋め込みによって保持される情報と失われる情報
構造をベクトルへ変換する方法は、エッジの有無をすべて並べる方法に限られない。ノード数、エッジ数、接続密度、経路の長さ、ノードの接続数など、グラフの特徴を取り出してベクトルを作る方法もある。構造から利用目的に応じた数値表現を得る研究では、グラフの局所的な関係や全体的な特徴を保持するさまざまな表現学習の方法が整理されている[16]。
例えば、グラフのノード数とエッジ数だけを特徴量として取り出す場合を考える。この埋め込み写像を次のように定義する。
\[
\phi_{\mathrm{count}}(S)=(|V|,|E|)
\]
\(\phi_{\mathrm{count}}\) は、構造 \(S\) を入力すると、ノード数とエッジ数からなる二次元ベクトルを返す写像である。先ほどの四つの部品と三つの関係からなる構造 \(S_0\) では、次の値が得られる。
\[
\phi_{\mathrm{count}}(S_0)=(4,3)
\]
ここで、別の構造 \(S’_0\) を考える。ノードは同じ四つであり、関係集合だけが次のように異なるとする。
\[
E’_0=\{(A,B),(B,D),(C,D)\}
\]
この構造でも、ノード数は四つ、エッジ数は三つである。そのため、同じ埋め込み写像を使用すると、次のようになる。
\[
\phi_{\mathrm{count}}(S’_0)=(4,3)
\]
二つの構造は関係集合が異なるにもかかわらず、埋め込みベクトルは同じである。
\[
\phi_{\mathrm{count}}(S_0)
=\phi_{\mathrm{count}}(S’_0)
\]
したがって、埋め込み後のユークリッド距離はゼロになる。
\[
d(S_0,S’_0)=0
\]
しかし、元の関係集合は一致していない。\(S_0\) には \((B,C)\) が存在する一方、\(S’_0\) には \((B,D)\) が存在する。異なる構造が同じベクトルへ変換される理由は、ノード数とエッジ数という二つの特徴量だけでは、エッジの接続先を記録していないためである。
このように、異なる入力が同じ出力へ対応する写像は、単射ではないという。単射とは、異なる入力が必ず異なる出力へ対応する性質である。構造の埋め込み写像が単射であれば、異なる構造を異なるベクトルとして区別できる。一方、単射でなければ、元の構造が異なっていても同じベクトルになる場合がある。
数学的な距離には、いくつかの基本的な条件がある。通常の距離では、異なる二つの対象の距離がゼロにならないことが求められる。具体的には、次の条件である。
\[
d(S_a,S_b)=0\iff S_a=S_b
\]
記号 \(\iff\) は、左側と右側の条件が互いに同値であることを表す。つまり、距離がゼロであることと、二つの対象が同一であることが一致するという意味である。
ところが、単射でない埋め込み写像から距離を定義した場合、異なる構造が同じベクトルへ写され、距離がゼロになることがある。この場合、元の構造集合上で得られる量は、一般に擬距離となる。
擬距離は、非負性、対称性、三角不等式を満たす一方、異なる二つの対象について距離がゼロになることを許す。例えば、埋め込み後のユークリッド距離は、元の構造の区別をすべて保持していなくても、三角不等式などの性質を維持する。しかし、距離がゼロという結果だけで元の構造の同一性まで結論できるとは限らない。
この区別は、構造振動モデルの測定結果を解釈する際に直接関係する。例えば、ノード数とエッジ数だけを記録する埋め込みでは、接続先の付け替えが発生しても、構造間距離がゼロになる場合がある。その結果、構造が更新されているにもかかわらず、測定上は変化が存在しないように見える。
一方、固定されたノード集合とエッジ候補について、各エッジの有無をすべて記録する二値ベクトルなら、候補集合内のエッジ配置の違いを区別できる。比較対象となる構造を、その候補集合だけで完全に表現できるグラフに限定すれば、異なる関係集合は異なるベクトルとなる。この条件の下では、埋め込み後の距離がゼロであることから、対象とする関係構造が同一であると判断できる。
ただし、同じベクトル表現でも、候補集合に含まれない関係の変化や、記録していない重みの変化は検出できない。比較対象をどこまで含めるかという定義が、測定可能な構造差の範囲を決める。
6.7. 時間とともに変化するグラフを比較する条件
構造振動モデルでは、構造が時間とともに更新される。そのため、異なる時点のグラフを比較するときには、ベクトルの各成分が同じ意味を持ち続けることが重要になる。例えば、時刻 0 では一番目の成分が A から B への関係を表していたのに、時刻 1 では A から C への関係を表すように変更されていた場合、二つのベクトルの同じ位置を比較しても、その差が構造更新によるものか、表現規則の変更によるものかを区別できない。
ノードやエッジが追加される場合にも、同様の問題が発生する。例えば、四つの部品に新しい部品 E が追加された場合、比較対象となるエッジ候補が増加する。最初に六次元のベクトルで表していた構造を、追加後に別の次元のベクトルで表すと、そのままではユークリッド距離を計算できない。
この場合には、比較する全期間で共通するノードとエッジの候補集合を定義する方法が考えられる。ある時点で存在しないノードやエッジも、共通の候補集合の中で不存在として表現すれば、各時点のベクトルの次元をそろえられる。ただし、比較対象となる候補を追加する際には、過去の構造も同じ規則で表現し直す必要がある。
別の方法として、ノードやエッジの対応関係を推定したうえで、構造の特徴を共通の次元へ変換する方法がある。時間とともに更新されるグラフの表現学習では、構造の変化を反映しながら時点間の比較に利用できる表現を得る方法が研究されている[17]。ただし、異なる時点で別々に学習された埋め込みは、座標軸の向きや尺度が一致しているとは限らない。数値を直接比較するには、共通の表現規則や座標の対応づけが必要になる。
また、グラフが時間とともに変化する場合には、どの時点で関係が存在していたかという情報も意味を持つ。時間依存ネットワークの研究では、関係の発生時刻や持続期間を含むネットワークの性質が扱われている[18]。例えば、同じ三本の通信経路が存在していても、同時に利用可能だった場合と、異なる時刻に順番に利用可能だった場合とでは、情報が伝達できる範囲が異なる可能性がある。
構造振動モデルで各時点の構造を比較する場合にも、観測時点の設定が重要になる。例えば、一日に何度も接続が切り替わるシステムを一日一回だけ記録すると、途中で発生した変更が観測されない可能性がある。反対に、短い時間間隔で記録すれば、短期間の構造更新を検出できるが、観測データの量も増える。
この違いは、構造の更新量を測定する際にも影響する。例えば、時刻 0 と時刻 2 で同じ構造が存在していても、時刻 1 で一度関係が追加され、その後削除されていた場合を考える。時刻 0 と時刻 2 だけを比較すると、構造間距離はゼロになる。一方、時刻 0、1、2 のすべてを記録すれば、追加と削除という二回の更新を測定できる。
このように、構造の時間的な比較では、構造の表現規則だけでなく、観測間隔と記録の粒度も測定結果に影響する。構造が実際に更新された回数と、観測した時点間で検出された更新量を同一視すると、途中の変更を見落とす可能性がある。
6.8. 距離の定義が構造振幅の意味を決める
構造振動モデルでは、隣接する二つの時点の構造間距離を、構造振幅として用いる。時刻 \(t\) の構造を \(S_t\)、一つ前の時点の構造を \(S_{t-1}\) とすると、構造振幅 \(A_t\) は次のように定義される。
\[
A_t=d(S_t,S_{t-1})
\]
この定義は、構造が一つ前の時点からどの程度変化したかを表す。埋め込み後のユークリッド距離を採用する場合には、次の式となる。
\[
A_t=\|\phi(S_t)-\phi(S_{t-1})\|_2
\]
\(A_t\) は非負の値を取り、埋め込みベクトルが変化していなければゼロになる。二値ベクトルによってエッジの有無を記録する場合には、追加または削除されたエッジの本数の平方根として構造振幅を計算できる。
しかし、同じ構造更新であっても、埋め込み写像や距離の定義を変更すれば、振幅の数値も変化する。例えば、ノード数とエッジ数だけを記録する場合には、接続先の変更が振幅に現れないことがある。一方、エッジの有無を個別に記録すれば、同じ変更を検出できる。
また、エッジの存在だけを測定する場合と、各エッジの通信時間を重みとして測定する場合では、振幅が表す意味が異なる。前者は接続構造の変更を測定し、後者は重みの変化も含めて測定する。さらに、複数の種類の重みを組み合わせる場合には、単位と尺度の違いが距離の計算結果に影響する。
構造振幅の比較可能性を確保するためには、少なくとも次の条件を明確にする必要がある。
| 定義項目 | 必要な条件 | 条件が満たされない場合 |
|---|---|---|
| 比較対象 | どの要素と関係を構造として記録するかを定義する。 | 測定対象の違いが構造更新として計上される。 |
| ノードの対応 | 異なる時点のノードを同じ対象として識別できるようにする。 | 名称変更や識別子の変更が構造差として現れる。 |
| 埋め込み写像 | 同じ規則で構造を共通のベクトル空間へ変換する。 | ベクトルの各成分が異なる意味を持ち、直接比較できなくなる。 |
| 保持する特徴 | 分析目的に必要な接続情報や重みを保持する。 | 実際の構造差が埋め込みによって失われる場合がある。 |
| 距離の定義 | どの数値の差を、どの規則で合計するかを定める。 | 同じ構造更新でも振幅の数値が一致しなくなる。 |
| 重みの単位 | 異なる重みを比較するための単位と尺度を定める。 | 数値の大きさが異なる測定単位に依存してしまう。 |
| 観測時点 | 構造を記録する時点と時間間隔を定める。 | 観測時点の間で生じた更新を見落とす場合がある。 |
これらの条件を固定すれば、同じ構造更新を同じ規則で測定できる。例えば、四つの部品と六つの関係候補を固定し、各関係の有無を 0 と 1 で記録する方法では、一つのエッジ追加による構造振幅は 1 となる。また、一つのエッジを削除して別のエッジを追加する変更では、構造振幅は \(\sqrt{2}\) となる。この結果は、何を数え、どのように距離へ変換したかが明確であるため、再現可能である。
一方、構造振幅の数値だけから、構造更新が合理的だったかどうかを判断することはできない。例えば、構造振幅が 1 の更新であっても、重要な障害経路を削除した場合と、不要な監視経路を削除した場合では、運用上の影響が異なる可能性がある。構造間距離は、採用した表現の下で構造がどの程度異なるかを示す量であり、その変更によって生じる利益や損失は別の評価を必要とする。
さらに、構造振幅は更新の方向を直接表す量でもない。エッジを一つ追加した場合と、一つ削除した場合には、二値ベクトルのユークリッド距離はどちらも 1 となる。構造が複雑化したのか単純化したのかを判定するには、エッジ数、接続密度、依存関係の集中度など、更新方向を評価するための指標を別に定義する必要がある。
また、埋め込み写像が元の構造の違いを完全に保持していない場合、構造振幅がゼロでも構造が同一とは限らない。ノード数とエッジ数だけを記録する埋め込みでは、接続先の変更を検出できない場合がある。振幅がゼロという結果を解釈する際には、その埋め込みで測定可能な特徴が変化していないという意味と、元の構造全体が変化していないという意味を区別する必要がある。
構造振動モデルにおける埋め込みと距離は、構造の更新を比較可能な数値へ変換するための数学的な基盤である。グラフの要素と関係を定義し、埋め込み写像を固定し、距離の測定方法を明示することで、構造の変化量を定量的に記述できる。さらに、埋め込みが保持する情報と失う情報を区別すれば、構造振幅が何を測定しているかという範囲も明確になる。
このように、構造振幅は構造更新を数値として比較するための指標であり、その意味は構造表現と距離の定義によって決まる。構造の変化量を測定することによって、更新がいつ発生し、どの程度の規模であったかを記録できる。一方、更新の方向、原因、安定性、介入の効果を説明するには、構造振幅に加えて、構造を更新する規則と環境条件、観測結果を結びつける必要がある。
7. 環境・観測・介入による状態遷移を定義する
構造をグラフとして定義し、構造間の距離を測定できるようになると、各時点でどの程度の構造変更が生じたかを数値として記録できる。しかし、構造の変化量だけでは、その変更がなぜ行われたのか、どのような判断によって選択されたのか、変更後に何が起きたのかまでは説明できない。構造振動モデルでは、構造を更新する過程そのものを数学的に表現するため、現在の構造、環境条件、観測結果、介入を異なる変数として定義する。
例えば、ソフトウェアに新しい例外処理経路が追加された場合を考える。利用者から新しい要求が提出されたために経路を追加した場合と、既存の監視によって重大な障害が発見されたために追加した場合とでは、変更を選択した理由が異なる。また、同じ障害が観測されても、復旧時間を短縮するために経路を追加する判断と、障害の影響範囲を限定するために既存経路を分割する判断が考えられる。
構造振動モデルでは、こうした違いを状態遷移の入力条件として明示する。状態遷移とは、ある時点の状態から次の時点の状態が定まる過程である。構造がどのように更新されるかを記述するには、更新前の構造と更新後の構造を対応づけるだけでなく、更新の判断に利用された情報と、実際に行われた操作を区別する必要がある。
7.1. 構造と環境条件から観測結果を定義する
最初に、現在の構造が特定の環境条件の下でどのような結果を生むかを考える。時刻 \(t\) の構造を \(S_t\)、環境条件を \(C_t\)、観測結果を \(O_t\) とする。構造と環境条件から観測結果を定める規則を \(G\) と書けば、次のように表せる。
\[
O_t=G(S_t,C_t)
\]
左辺の \(O_t\) は、時刻 \(t\) に観測された結果である。右辺の \(S_t\) はその時点の構造、\(C_t\) は構造が置かれている環境条件を表す。\(G\) は、構造と環境条件を入力として受け取り、対応する観測結果を返す写像である。写像とは、与えられた入力に対して出力を対応づける数学的な規則を意味する。
構造 \(S_t\) は、すでに定義した有向重み付きグラフである。
\[
S_t=(V_t,E_t,W_t)
\]
\(V_t\) は構成要素、\(E_t\) は要素間の関係、\(W_t\) は関係に付随する重みを表す。ソフトウェアの例では、部品の集合、呼び出し関係、必要に応じて定義した通信経路の特性などが構造に含まれる。
一方、環境条件 \(C_t\) には、構造の外側から与えられる要求や、動作結果に影響する運用条件などを含める。例えば、入力件数、入力データの種類、外部サービスの状態、利用可能な処理資源、運用上の制約などが該当する。どの条件を環境変数として記録するかは、分析対象とする現象によって決める。
観測結果 \(O_t\) は、その構造が環境条件の下で動作した結果として記録される情報である。ソフトウェアであれば、処理時間、失敗した要求の件数、障害の発生数、復旧時間、記録された情報の件数などが考えられる。観測結果は一つの数値に限らず、複数の測定値をまとめたベクトルとして表すこともできる。
例えば、処理時間、失敗件数、記録件数を観測するとすれば、次のように表せる。
\[
O_t=(T_t,F_t,R_t)
\]
\(T_t\) は処理時間、\(F_t\) は失敗した要求の件数、\(R_t\) は記録された要求の件数である。これらを同じ観測期間について記録すれば、ある構造が特定の環境条件の下でどのような動作を示したかを数値として表せる。ただし、処理時間と件数は異なる単位を持つため、後から一つの評価値へ統合する場合には、単位や重みづけを別に定義する必要がある。
この観測方程式の役割は、構造と運用結果を区別しながら結びつけることにある。同じ構造であっても、入力件数や利用パターンが異なれば、処理時間や失敗件数が異なる場合がある。反対に、構造が変更されていても、特定の環境条件では観測結果が同じになる場合がある。構造の変化と観測値の変化を同一視すると、構造更新の原因や効果を誤って評価する可能性が生じる。
7.2. 同じ構造でも環境が変われば観測結果は変化する
具体例として、受付 A、入力検証 B、処理 C、結果の記録 D からなる四つの部品を考える。通常の処理経路は A から B、B から C、C から D の順に接続されている。この構造を \(S\) とする。
\[
E=\{(A,B),(B,C),(C,D)\}
\]
この構造に対して、一秒間に 50 件の要求が到着する環境と、一秒間に 150 件の要求が到着する環境を比較する。ここでは、要求を処理する能力が一秒間に 100 件であり、到着した要求を処理できるまで待機させる仕組みが存在すると仮定する。
一秒間に 50 件の要求が到着する場合、処理能力が要求の到着数を上回るため、他の条件が適切であれば、要求を継続して処理できる。一方、一秒間に 150 件の要求が継続して到着する場合、処理能力を毎秒 50 件上回る要求が発生する。待機中の要求が蓄積されるため、待ち行列の長さや応答時間が増大する可能性がある。
二つの環境条件を \(C^{(1)}\)、\(C^{(2)}\) とすると、次のように表せる。
\[
\begin{aligned}
C^{(1)}&=(50\text{ 件/秒})\\
C^{(2)}&=(150\text{ 件/秒})
\end{aligned}
\]
実際の環境条件には入力の種類や外部サービスの状態なども含まれるが、ここでは要求の到着頻度以外を同じに保つ。すると、構造 \(S\) が同一であっても、観測結果は異なる場合がある。
\[
G(S,C^{(1)})\neq G(S,C^{(2)})
\]
この式は、構造を固定したまま環境条件を変更すると、観測結果が変化し得ることを表している。要求の到着頻度が増えたことで待ち行列が発生した場合、処理時間の増大を説明する直接の条件は到着頻度と処理能力の関係にある。部品間の呼び出し関係そのものが変更されたとは限らない。
一方、同じ環境条件の下で、入力検証 B から記録 D への関係を追加した場合を考える。入力検証で拒否された要求も記録できるようになるため、拒否された要求を含む入力条件では、記録件数が変化する可能性がある。
更新前の構造を \(S^{(0)}\)、更新後の構造を \(S^{(1)}\) とすると、次の関係を考えられる。
\[
G(S^{(0)},C)\neq G(S^{(1)},C)
\]
この場合は、環境条件を同じに保った比較によって、構造更新に伴う観測結果の差を調べている。環境条件が異なる場合と構造が異なる場合を区別することで、何が変化したのかを明確にできる。
ただし、構造を変更しても観測結果が同じになる場合がある。例えば、入力検証に失敗した要求を記録する経路を追加しても、正常な要求だけを与えた場合には、その経路は使用されない。正常な入力に対する観測結果だけを比較すれば、変更前後で同じ値が得られる可能性がある。
\[
G(S^{(0)},C_{\mathrm{normal}})
=G(S^{(1)},C_{\mathrm{normal}})
\]
\(C_{\mathrm{normal}}\) は正常な入力だけを与える環境条件を表す。この等式が成立しても、二つの構造が同一であるとは限らない。観測結果が同じになる理由は、選択した入力条件では追加された経路が使用されないためである。
このように、観測結果だけから構造を一意に特定するには、観測方程式の性質を確認する必要がある。異なる構造が同じ観測結果を生む場合、観測値の一致は構造の一致を保証しない。構造振動モデルでは、構造を直接記録した情報と、構造が生み出した観測結果を分けて保持することで、この違いを扱える。
7.3. 観測結果から構造更新を決める規則を定義する
観測結果が得られると、その情報に基づいて構造を維持するか、変更するかを判断できる。例えば、例外処理経路がほとんど使用されず、維持費用が大きいことが観測された場合、経路を削除する判断が考えられる。一方、使用頻度が低くても重大な障害を防ぐ役割を持つ場合には、経路を維持する判断が合理的になることがある。
ここで、観測結果そのものと、その結果に基づく判断を区別する必要がある。観測結果は実際に何が起きたかを示す情報であり、構造をどのように変更するかという判断は、目的や制約条件に依存する。同じ観測結果が得られても、何を優先するかによって選択する構造が異なる場合がある。
構造振動モデルでは、この判断と構造更新の関係を状態更新写像によって表す。時刻 \(t\) の構造を \(S_t\)、環境条件を \(C_t\)、観測結果を \(O_t\)、外部からの介入を \(U_t\) とする。更新写像を \(M\) とすると、次の時点の構造は次のように定義される。
\[
S_{t+1}=M(S_t,C_t,O_t,U_t)
\]
左辺の \(S_{t+1}\) は、次の時点における構造である。右辺の \(M\) は、現在の構造、環境条件、観測結果、介入を入力として受け取り、更新後の構造を返す規則を表す。構造が変化する場合だけでなく、現在の構造を維持する場合も、この写像によって表現できる。
各変数は、構造更新の過程で異なる役割を持つ。\(S_t\) は更新の対象となる現在の構造、\(C_t\) は構造が置かれている条件、\(O_t\) はその条件の下で得られた結果、\(U_t\) は構造に対して実行される介入を表す。更新写像 \(M\) は、これらの情報を組み合わせて次の構造を定める。
この関係を集合の写像として表すこともできる。比較対象となる構造の集合を \(\mathcal{S}\)、環境条件の集合を \(\mathcal{C}\)、観測結果の集合を \(\mathcal{O}\)、介入の集合を \(\mathcal{U}\) とする。このとき、更新写像 \(M\) は次のように定義できる。
\[
M:\mathcal{S}\times\mathcal{C}\times\mathcal{O}\times\mathcal{U}
\to\mathcal{S}
\]
記号 \(\times\) は、各集合から要素を一つずつ取り出して組を作る操作を表す。この式は、構造、環境、観測、介入の四つを組にした入力から、次の構造を決めることを意味する。更新後の構造も \(\mathcal{S}\) に属するため、同じ形式で繰り返し状態更新を記述できる。
例えば、入力検証 B から記録 D への経路が存在しない構造を \(S^{(0)}\)、その経路を追加した構造を \(S^{(1)}\) とする。介入として「経路を追加する」と「構造を維持する」という二つの選択肢を考える。現在の構造が \(S^{(0)}\) であり、経路追加の条件が満たされている場合、追加を実行する介入によって、次の構造が \(S^{(1)}\) になる。
\[
M(S^{(0)},C_t,O_t,U_{\mathrm{add}})=S^{(1)}
\]
\(U_{\mathrm{add}}\) は、B から D への経路を追加する介入を表す。構造を維持する介入を \(U_{\mathrm{keep}}\) とすれば、次のように表せる場合もある。
\[
M(S^{(0)},C_t,O_t,U_{\mathrm{keep}})=S^{(0)}
\]
この二つの式では、現在の構造、環境条件、観測結果を同じに保ち、介入だけを変更している。介入の違いによって次の構造が異なることを表している。実際にどの介入を選択するかは、観測結果だけでなく、変更の目的や安全上の制約などによって決まる。
なお、介入を行わない場合でも、構造が必ず維持されるとは限らない。更新写像 \(M\) に、環境条件や内部状態に応じて自動的に構造を変更する規則が含まれていれば、外部からの介入がなくても次の構造が変化する場合がある。例えば、負荷の増加に応じて処理経路を自動的に追加する仕組みでは、明示的な人間の操作がなくても構造更新が発生する。何を介入と呼び、何を更新写像に組み込まれた自動的な動作とするかは、モデルの定義によって明確にする。
7.4. 同じ観測結果から異なる構造更新が生じる理由
更新写像の役割を理解するため、例外処理経路の維持費用と障害時の損失を比較する。ある経路が存在しない場合、評価期間中に例外が発生する確率を \(p_t\)、発生した場合の損失を \(L_t\) とする。また、その経路を維持する費用を \(c_t\) とする。ここでは、経路を維持すれば対象の損失をすべて回避でき、他の影響は維持費用に含まれていると仮定する。
経路を設けない場合の期待損失は、次のようになる。
\[
C_{\mathrm{without},t}=p_tL_t
\]
一方、経路を維持する場合の費用は、仮定の下では次のようになる。
\[
C_{\mathrm{with},t}=c_t
\]
期待費用を小さくすることを目的とする場合、次の条件を満たせば経路を維持する方が有利となる。
\[
c_t<p_tL_t
\]
例えば、例外の発生確率が \(p_t=0.2\)、発生した場合の損失が \(L_t=100\)、経路の維持費用が \(c_t=5\) であるとする。この場合、経路を設けない場合の期待損失は 20 となり、維持費用の 5 を上回る。期待費用を最小化する更新規則なら、経路の追加または維持を選択することになる。
\[
p_tL_t=0.2\times100=20
\]
次に、運用結果から例外の発生確率に関する推定値が変化し、将来の評価期間について \(p_{t+1}=0.01\) と見積もられたとする。損失と維持費用が同じであれば、期待損失は 1 となる。
\[
p_{t+1}L_{t+1}=0.01\times100=1
\]
この場合、維持費用の 5 が回避できる期待損失の 1 を上回るため、期待費用だけを評価する更新規則では、経路の削除が選択され得る。ただし、削除によって他の経路の負荷が増加する場合や、安全上の理由で経路の保持が義務づけられている場合には、その条件を評価に含める必要がある。
ここで、同じ観測結果に対して、異なる更新規則を考える。一方の規則は期待費用を最小化し、もう一方の規則は重大な障害が発生した場合にも記録機能を維持することを優先するとする。両者が同じ発生確率や維持費用を観測していても、後者には削除できる経路について追加の制約が存在する。
この違いを表すため、二つの更新写像を \(M_{\mathrm{cost}}\) と \(M_{\mathrm{safety}}\) と書く。前者は期待費用に基づく更新規則、後者は安全上の制約を含む更新規則を表す。同じ構造、環境、観測、介入の条件で比較しても、二つの規則が返す構造は異なる場合がある。
\[
M_{\mathrm{cost}}(S_t,C_t,O_t,U_t)
\neq
M_{\mathrm{safety}}(S_t,C_t,O_t,U_t)
\]
これは、更新写像そのものの定義が構造更新の結果に影響することを表している。観測結果が一つに定まっていても、その情報をどの目的と制約の下で評価するかが異なれば、次の構造も異なる可能性がある。
実際の更新規則は、期待費用だけでなく、機能の維持、障害時の復旧能力、法令上の要求、変更可能な範囲などを組み合わせたものとなる。例えば、復旧時間を最優先する運用では、冗長な経路を維持することが合理的な場合がある。一方、変更箇所を最小化する運用では、同じ冗長性を維持しながら、既存の経路の一部を再利用する構造が選択される可能性がある。
この意味で、更新写像 \(M\) は単なる構造変更の手続きを表すだけでなく、どの条件でどの変更を選択するかという判断規則も含む。構造振動モデルにおいて複雑化と単純化が交代する仕組みは、この判断規則と、時間とともに変化する環境・観測の組み合わせとして表現できる。
7.5. 環境条件も観測結果によって更新される
構造が更新される一方で、構造を取り巻く環境も一定とは限らない。例えば、障害が発生した後に利用者が操作方法を変更したり、運用担当者が監視の条件を変更したりする場合がある。また、特定の経路の障害が頻発すれば、利用者がその経路を避けるようになり、次の時点では要求の分布が変化する可能性がある。
このような環境の更新を表すため、既稿の構造振動モデルでは、環境更新写像 \(H\) を定義している。
\[
C_{t+1}=H(C_t,O_t)
\]
左辺の \(C_{t+1}\) は次の時点の環境条件である。右辺の \(C_t\) は現在の環境条件、\(O_t\) は現在の観測結果である。\(H\) は、これらの情報に基づいて次の環境条件を定める写像を表す。
例えば、ある操作によって障害が頻繁に発生することが観測された場合を考える。運用担当者が障害報告を受けて利用手順を変更すれば、次の時点では問題となる操作の頻度が減少する可能性がある。この場合、観測された障害が運用上の対応を促し、その対応によって次の環境条件が変化する。
ここでは、障害報告を受けて手順を変更するという運用上の仕組みが、写像 \(H\) に含まれている。観測結果そのものが物理的に環境を変更するという意味ではなく、観測情報に応じて行われる運用上の対応までを含めて、環境の更新規則として表現している。
別の例として、入力検証で拒否された要求の件数が増加したため、利用者向けの入力手順を修正する場合を考える。手順の変更によって不正な形式の入力が減少すれば、次の時点では入力データの分布が変化する。この場合、ソフトウェアの呼び出し関係を変更しなくても、観測結果に基づく運用変更によって環境条件が更新される。
ただし、環境の変化がすべて観測結果から生じるとは限らない。例えば、新しい法令の施行、外部サービスの仕様変更、利用者数の急増などは、対象システムの観測結果とは独立して発生する場合がある。このような外部から与えられる変化を外生的な条件と呼ぶ。
既稿の式 \(C_{t+1}=H(C_t,O_t)\) は、環境の変化が現在の環境と観測結果によって表現できる場合の定義である。外生的な変化も明示的にモデル化する場合には、その情報を環境状態に含めて扱うか、環境更新写像に外生入力を追加する方法が考えられる。
例えば、外生入力を \(Z_t\) とすれば、拡張した環境更新式は次のように表せる。
\[
C_{t+1}=H(C_t,O_t,Z_t)
\]
\(Z_t\) は、現在の構造や観測結果によって直接決まらない外部条件を表す。この式は、外生入力を明示的に区別する場合の拡張であり、既稿の環境更新式を置き換えるものではない。分析対象に必要な条件が現在の環境と観測結果に含まれているなら、元の二変数の形式を使用できる。
7.6. 観測と更新が循環する仕組み
ここまで定義した三つの方程式を組み合わせると、構造振動モデルの基本的な状態遷移を表せる。
\[
\begin{aligned}
O_t&=G(S_t,C_t)\\
S_{t+1}&=M(S_t,C_t,O_t,U_t)\\
C_{t+1}&=H(C_t,O_t)
\end{aligned}
\]
第一の式は、現在の構造と環境条件から観測結果を得る関係である。第二の式は、構造、環境、観測、介入から次の構造を定める関係である。第三の式は、現在の環境と観測結果から次の環境条件を定める関係である。
これらを順番に考えると、まず時刻 \(t\) の構造 \(S_t\) が環境 \(C_t\) の下で動作し、観測結果 \(O_t\) が得られる。その結果を利用して構造の更新が行われ、次の構造 \(S_{t+1}\) が定まる。同時に、観測結果に基づく運用変更などによって、次の環境条件 \(C_{t+1}\) が定まる。
次の時点では、新しい構造 \(S_{t+1}\) が新しい環境 \(C_{t+1}\) の下で動作する。その結果、新しい観測結果 \(O_{t+1}\) が得られる。
\[
O_{t+1}=G(S_{t+1},C_{t+1})
\]
この関係が時間とともに繰り返されることで、構造、環境、観測、介入が相互に関係する更新過程が形成される。
この循環を具体例で確認する。最初に、入力検証 B から記録 D への経路が存在しない構造を考える。運用中に入力検証で拒否された要求が多数発生したが、その内容を記録する経路が存在しないため、障害調査に必要な情報が不足したとする。
この時点では、環境条件として不正な形式の入力が存在し、観測結果として拒否件数と記録情報の不足が得られている。運用担当者がその情報に基づいて、B から D への記録経路を追加する介入を選択すれば、次の構造には新しい関係が含まれる。
追加後の構造では、拒否された要求を記録できるようになる。その結果、次の観測時点では拒否された要求の内容や発生頻度を詳しく把握できる。取得された情報を基に利用者向けの入力手順を修正すれば、不正な入力の発生頻度が減少する可能性がある。
さらに、不正な入力が減少し、専用の記録経路を維持する費用が大きいことが分かれば、別の共通記録経路へ処理を統合する判断が生じる場合がある。このように、最初は観測可能性を確保するために関係を追加し、その後の観測から関係を統合する判断が生じる過程を、同じ三つの方程式で表現できる。
この循環では、構造の追加が新しい観測を可能にし、その観測によって次の判断条件が変化する。つまり、構造更新は現在の問題へ対応するだけでなく、将来に得られる情報の種類にも影響する。新しい観測が得られることで、以前は合理的だった構造を変更する理由が生じる可能性がある。
観測を受けて操作を行い、その操作の結果を再び観測する仕組みは、フィードバックと呼ばれる。フィードバックでは、過去の結果が将来の操作や状態に影響する。構造振動モデルでは、観測結果が更新写像へ入力され、構造そのものが変更され得る点が特徴となる。
状態空間モデルでは、状態、観測、時間発展を区別して動的な系を記述する。Kalman のフィルタリングと予測の研究は、状態と観測の関係を数学的に扱う代表的な出発点である[19]。ただし、Kalman の原論文で扱われる線形状態空間モデルと、グラフを状態とする一般の構造振動モデルは同一の数学的対象ではない。共通するのは、内部状態と観測結果を区別し、時間に沿った変化を数式で記述するという基本的な考え方である。
フィードバック制御では、観測結果に応じた操作が将来の状態に作用し、その操作規則が安定性に影響する。Åström と Murray の制御理論では、フィードバックによる動的システムの振る舞いを、安定性や応答特性などの観点から扱っている[20]。構造振動モデルでは、制御対象となる状態が、最初から構成要素と関係を持つグラフとして与えられる。観測に応じてグラフの構成自体が更新される場合を、状態遷移として扱う。
7.7. 更新写像の連続性と急激な構造変更
更新写像を数学的に扱う場合には、入力条件が少し変化したとき、更新後の構造がどの程度変化するかという性質も問題になる。例えば、要求数がわずかに増えただけでシステム全体の構成が大幅に変更される場合と、負荷に応じて一部の処理経路だけが追加される場合では、更新規則の振る舞いが異なる。
構造振動モデルの既稿では、更新が急激に変化する性質を制限するため、局所有界性や局所 Lipschitz 性という正則性条件も検討されている。正則性とは、数学的な対象が一定の規則性を持つことを表す言葉である。ここでは、更新写像の出力が、入力のわずかな差に対してどの程度変化するかを考えるために用いる。
局所有界性は、ある対象範囲の中で更新後の構造や構造変化量が一定の上限に収まるという性質である。例えば、構造間距離を \(d\) とし、対象とする入力条件の範囲において、一回の更新による構造差がある定数 \(B\) 以下であると仮定する。
\[
d(S_{t+1},S_t)\le B
\]
\(B\) は、対象範囲における一回の構造更新量の上限を表す。この条件が成立すれば、その範囲の入力条件の下では、一回の更新による構造振幅が \(B\) を超えない。ただし、どの入力条件を対象とするか、どの距離を採用するかによって上限の意味は変わる。また、一回の更新が有界であることだけで、長期間にわたる状態の有界性や収束が保証されるわけではない。
例えば、各時点でエッジを最大一本だけ追加する更新規則を考える。エッジの有無を二値ベクトルで表し、ユークリッド距離を使用する場合、一回の更新による構造振幅は最大 1 となる。
\[
A_t\le1
\]
この規則は、一回の変更量を制限している。しかし、毎回異なるエッジが追加され続けるなら、初期構造からの距離は増加する可能性がある。各時点の変更量の上限と、時間を通じた構造全体の安定性は区別される。
局所 Lipschitz 性は、近い入力に対して、更新結果の距離が入力間の距離の一定倍率以内に収まるという性質である。この条件を定義するには、まず更新写像への入力全体について、何を距離として測るかを定める必要がある。
更新写像の入力を一つの組として、次のように表す。
\[
z=(S,C,O,U)
\]
二つの入力 \(z\) と \(z’\) の距離を \(D(z,z’)\) とする。また、更新後の二つの構造の距離を \(d\) とする。このとき、ある入力の近傍において、正の定数 \(L\) が存在し、次の関係が成立するなら、更新写像はその範囲で Lipschitz 条件を満たす。
\[
d(M(z),M(z’))\le L D(z,z’)
\]
左辺は、二つの入力から得られた更新後の構造間距離である。右辺は、入力全体の距離に定数 \(L\) を掛けた値である。\(L\) は、入力の変化に対して出力の変化がどの程度まで増幅され得るかを制限する定数として働く。
例えば、処理能力を追加するかどうかを、要求数が一定の閾値を超えたかによって決める規則を考える。要求数が閾値を超えた瞬間に新しい経路を一本追加し、それ以下では追加しないとする。この場合、閾値の直前と直後では、要求数の差が非常に小さくても、構造には一本のエッジの差が生じる。
このような規則は、連続的な環境変数に対して不連続な更新を行う可能性がある。数学的には、閾値付近で入力の距離をいくらでも小さくできる一方、更新結果の構造間距離が正の値を保つなら、有限の定数 \(L\) による Lipschitz 条件は成立しない。
例えば、環境の変化を実数 \(c\) で表し、\(c<0\) では経路を追加せず、\(c\ge0\) では経路を一本追加する規則を考える。更新結果を、経路が存在しない場合は 0、存在する場合は 1 として簡略化する。
\[
f(c)=
\begin{cases}
0 & (c<0)\\
1 & (c\ge0)
\end{cases}
\]
閾値の前後である \(-\varepsilon\) と \(\varepsilon\) を考える。\(\varepsilon\) は任意の正の小さな数である。入力間の距離は \(2\varepsilon\) だが、出力間の距離は常に 1 となる。
\[
|f(\varepsilon)-f(-\varepsilon)|=1
\]
この二つの入力について Lipschitz 条件が成立するなら、次の不等式が必要になる。
\[
1\le2L\varepsilon
\]
しかし、\(L\) を有限の定数として固定したまま \(\varepsilon\) を十分小さくすると、この不等式は成立しなくなる。したがって、この更新規則は閾値の位置で局所 Lipschitz 性を満たさない。
この例は、構造の更新が離散的な判断を含む場合、入力が小さく変化しても、更新結果が不連続に切り替わる可能性を示している。ソフトウェアの設定変更、権限の付与、処理経路の追加や削除などは、連続的な入力値に対して離散的な操作を実行する場合がある。そのため、一般的な連続写像に対する正則性条件を、すべての構造更新規則へそのまま適用できるとは限らない。
一方、入力や出力に採用する距離の定義によっても、Lipschitz 条件の意味は変わる。例えば、有限個のグラフだけを対象とし、異なるグラフ間の距離に正の最小値が存在する場合、その距離空間では各構造が孤立した点となる。このような離散的な構造空間では、局所的な距離条件が容易に成立する場合がある。しかし、それだけで、要求数のような連続的な環境変数に対して更新結果が滑らかに変化することまで保証されるわけではない。
構造振動モデルで正則性条件を利用する場合には、構造、環境、観測、介入のうち、どの入力を変化させ、どの入力を固定するかを定める必要がある。例えば、環境条件だけを変化させる場合と、現在の構造自体を変化させる場合では、確認する性質が異なる。さらに、構造間距離をエッジ編集数とする場合と、埋め込み後のユークリッド距離とする場合でも、更新結果の差の評価方法が異なる。
7.8. 状態遷移の各変数が担う役割
構造振動モデルでは、構造、環境、観測、介入を分けることによって、実際の変更を異なる観点から記録できる。例えば、障害件数が増加した場合に、その原因を現在の構造だけへ帰属させるのではなく、入力件数や利用方法などの環境条件、実際に観測された結果、行われた介入を区別して調べられる。
これらの役割を整理すると、次のようになる。
| 対象 | 数理モデル上の役割 | ソフトウェアにおける具体例 | 区別すべき情報 |
|---|---|---|---|
| 構造 \(S_t\) | 現在の要素、関係、重みを表す。 | 部品間の呼び出し関係や依存関係を記録する。 | 構造そのものと、構造が生んだ観測結果を区別する。 |
| 環境 \(C_t\) | 構造が動作する条件を表す。 | 入力件数、入力の種類、外部サービスの状態などを記録する。 | 環境による変化と構造による変化を区別する。 |
| 観測 \(O_t\) | 構造が環境条件の下で生んだ結果を表す。 | 応答時間、失敗件数、復旧時間、記録件数などを測定する。 | 観測された事実と、原因についての推論を区別する。 |
| 介入 \(U_t\) | 構造へ加える操作を表す。 | 例外経路の追加、不要な経路の削除、依存関係の変更などを行う。 | 実行した操作と、その操作を選択した判断規則を区別する。 |
| 観測写像 \(G\) | 構造と環境から観測結果を定める。 | 同じ構造でも負荷によって応答時間が異なる関係を表す。 | 構造の同一性と観測結果の同一性を区別する。 |
| 更新写像 \(M\) | 現在の構造、環境、観測、介入から次の構造を定める。 | 期待損失や安全上の条件に応じて経路の追加・削除を決める。 | 更新規則の違いによって、同じ観測から異なる構造が生じ得る。 |
| 環境更新写像 \(H\) | 現在の環境と観測から次の環境を定める。 | 障害報告を受けた運用手順の変更によって入力条件が変化する。 | 観測に応じた環境の変化と、独立した外生的変化を区別する。 |
この表で示した各変数と写像は、構造更新の異なる側面を表している。例えば、障害件数が増加したという観測結果だけでは、構造を変更するべきかどうかは決まらない。入力件数が急増したことが原因であれば、環境条件への対応が必要になる場合がある。一方、特定の依存関係が障害を伝播させていることが分かれば、構造そのものを再編成する判断が考えられる。
同じように、構造変更の後に障害件数が減少した場合でも、その変化を介入の効果と判断するには、他の条件を確認する必要がある。例えば、変更と同時に入力件数が減少していたなら、観測された障害件数の減少には環境条件の変化も関係している可能性がある。状態遷移の記述は、構造更新と観測結果の時間的な対応を示すが、観測された変化の原因を一意に確定するには追加の条件が必要となる。
また、観測方程式 \(O_t=G(S_t,C_t)\) は、構造と環境が与えられたときの観測結果を写像として表現する形式である。実際の運用では、偶然的な変動、測定誤差、記録漏れ、モデルに含めていない環境条件などによって、同じ構造と環境の下でも異なる観測値が得られる場合がある。そのような場合には、偶然的な変動を環境条件に含めて表す方法や、確率的な観測モデルとして拡張する方法が考えられる。
更新写像 \(M\) についても同様である。判断主体が常に同じ規則を用い、同じ入力に対して同じ介入が与えられるなら、決定的な状態遷移として表現できる。一方、判断主体ごとに異なる選択が行われたり、確率的な仕組みによって介入が選択されたりする場合には、その選択過程を追加してモデル化する必要がある。どの要素を現在の変数と写像に含め、どの要素を外部条件として扱うかによって、モデルの説明可能な範囲が定まる。
構造振動モデルの状態遷移方程式は、構造更新の原因を一つの要因へ還元するためのものではない。現在の構造、環境条件、観測結果、介入がどのように組み合わされて次の構造を形成するかを明示するためのものである。複雑化、単純化、統合、分解という異なる構造更新も、同じ形式の更新写像によって表現できる。
この定義の下では、構造の変化量を測定することと、構造が変化する規則を記述することが接続される。構造間距離から得られる振幅は、更新前後の差を数値として表す。一方、状態更新写像は、その差を生む条件と操作を記述する。両者を組み合わせることで、どのような環境と観測の下で構造更新が選択され、その結果としてどの程度の構造差が生じたかを分析できる。
ただし、更新写像が定義されていることだけで、構造が安定化することや、更新方向が周期的に反転することが保証されるわけではない。例えば、同じ方向への更新が継続する写像もあれば、二つの構造を交互に選択する写像もある。環境条件の変化に応じて、長期間同じ構造を維持した後に大きく更新する写像も考えられる。状態遷移の具体的な性質は、更新写像と環境更新写像の定義によって決まる。
構造振動モデルでは、構造を有向重み付きグラフとして表し、環境と観測、介入による時間発展を三つの方程式で記述する。構造更新の規則を明示すれば、同じ観測結果から異なる構造が選択される理由や、構造更新によって将来の観測条件が変化する仕組みを説明できる。構造振幅が更新の大きさを表すのに対し、状態遷移方程式はその更新が生じる条件と過程を表している。
8. 構造振幅と更新方向を区別する
構造振動モデルでは、構造が時間とともに更新される過程を、隣接する時点の構造間距離によって測定する。構造をグラフとして記録し、各時点の構造を同じ埋め込み写像によって数値化すれば、更新前後の違いを一つの数値として表せる。この数値を構造振幅と呼ぶ。
ただし、構造振幅が表すのは、採用した測定方法における構造の変化量である。関係を追加した場合も、削除した場合も、変更された関係が同じ本数であれば、構造振幅が同じ値になることがある。構造振幅が大きいという観測結果だけでは、構造が複雑化したのか、単純化したのか、あるいは関係の配置が変更されたのかを判断できない。
この違いは、構造振動モデルにおける「振動」の意味を考えるうえでも重要である。構造振幅が繰り返し発生していることと、構造が複雑化と単純化を交互に繰り返していることは、数学的に異なる性質である。構造更新の大きさと更新方向を分けて定義することで、どのような変化が発生したかを詳しく記述できる。
8.1. 構造振幅は隣接時点間の変化量を表す
時刻 \(t\) の構造を \(S_t\)、その一つ前の時点の構造を \(S_{t-1}\) とする。二つの構造の距離を表す関数を \(d\) とすれば、時刻 \(t\) の構造振幅 \(A_t\) は次のように定義される。
\[
A_t=d(S_t,S_{t-1})
\]
ここで、\(A_t\) は時刻 \(t-1\) から時刻 \(t\) までの間に生じた構造の変化量を表す。構造間距離を計算する際には、比較する構造を同じ規則で表現する必要がある。
構造をベクトル空間へ変換する埋め込み写像を \(\phi\) とし、埋め込み後のユークリッド距離を採用する場合、構造振幅は次のように表せる。
\[
A_t=\|\phi(S_t)-\phi(S_{t-1})\|_2
\]
\(\phi(S_t)\) は時刻 \(t\) の構造を数値化したベクトルである。\(\|\cdot\|_2\) はユークリッドノルムを表し、ベクトルの各成分の差を二乗して合計し、その平方根を取る操作である。二つの構造のベクトルが同じであれば構造振幅はゼロになり、ベクトルの差が大きくなれば構造振幅も大きくなる。
構造振幅は距離として定義されているため、常に非負である。
\[
A_t\ge0
\]
非負とは、ゼロ以上の値を取ることである。構造振幅が 1 であれば、採用した距離の定義の下で二つの構造が距離 1 だけ異なることを意味する。振幅が 2 であれば距離 2 だけ異なることを意味する。しかし、振幅には正負の符号がないため、構造のどの性質が増加したのか、どの性質が減少したのかは、その値だけでは分からない。
例えば、呼び出し経路を一本追加した場合と、一本削除した場合を考える。エッジの有無を 0 と 1 で表す二値ベクトルを使い、ユークリッド距離を計算すると、どちらの変更でも構造振幅は 1 になる。
経路を追加した場合には、対応する成分が 0 から 1 へ変化する。経路を削除した場合には、1 から 0 へ変化する。二つの操作では差の符号が異なるが、ユークリッド距離を計算するときには差を二乗するため、どちらの場合も同じ結果になる。
\[
(1-0)^2=1
\]
\[
(0-1)^2=1
\]
この計算から、構造振幅は変更の有無と大きさを測定する一方、追加と削除の方向を区別する情報は保持しないことが分かる。更新方向を分析するには、構造のどの性質が増減したかを表す別の尺度が必要になる。
8.2. 複雑さの尺度を別に定義する
構造更新の方向を測定するため、構造の複雑さを表す関数 \(K\) を定義する。\(K\) は構造を入力として受け取り、その構造について選択した複雑さの尺度を数値として返す関数である。
\[
K:\mathcal{S}\to\mathbb{R}
\]
\(\mathcal{S}\) は比較対象となる構造の集合、\(\mathbb{R}\) は実数の集合である。この定義では、構造のどの性質を複雑さとして測定するかを、関数 \(K\) によって決める。
最も簡単な例として、グラフに含まれるエッジの本数を複雑さの尺度として使用する方法がある。時刻 \(t\) における関係集合を \(E_t\) とすると、次のように定義できる。
\[
K(S_t)=|E_t|
\]
ここで \(|E_t|\) は、時刻 \(t\) に存在するエッジの本数を表す。この定義を採用すると、エッジが追加されれば複雑さの値が増加し、削除されれば減少する。例えば、エッジが三本の構造では \(K(S_t)=3\)、四本の構造では \(K(S_t)=4\) となる。
ただし、エッジ数は構造の複雑さを表す指標の一つである。ソフトウェアの設計では、エッジ数が少なくても、多数の処理が特定の部品へ集中していれば、その部品の変更が広い範囲に影響する可能性がある。反対に、エッジ数が多くても、各部品の責務が明確に分離されていれば、変更の影響を限定できる場合がある。
例えば、ある部品が十個の部品から呼び出される構造と、十個の呼び出し関係が異なる部品へ分散している構造を考える。両者のエッジ数は同じでも、依存関係の集中度は異なる。構造の複雑さを、単純な関係数として評価するのか、依存関係の集中度として評価するのかによって、得られる結論は異なる。
ここでは、構造振幅と更新方向の違いを明確にするため、まずエッジ数を尺度 \(K\) として採用する。この選択によって測定できるのは、関係数の増減である。実際の運用負担や障害の影響範囲を評価する場合には、それらに対応する別の尺度や観測結果を用いる必要がある。
8.3. 複雑さの増減を符号付きの量で表す
構造の複雑さを表す尺度 \(K\) が定義されれば、隣接する時点の差を計算できる。時刻 \(t\) の複雑さと、その一つ前の時点の複雑さの差を \(\Delta K_t\) とする。
\[
\Delta K_t=K(S_t)-K(S_{t-1})
\]
\(\Delta\) は差分を表す記号である。この式は、更新後の複雑さから更新前の複雑さを引くことを意味する。
例えば、更新前のエッジ数が三本、更新後のエッジ数が四本であれば、次のようになる。
\[
\Delta K_t=4-3=1
\]
値が正であるため、エッジ数が増加したことが分かる。反対に、更新前が四本、更新後が三本であれば、次のようになる。
\[
\Delta K_t=3-4=-1
\]
値が負であるため、エッジ数が減少したことが分かる。エッジ数が変化しなかった場合には、差分はゼロとなる。
\[
\Delta K_t=0
\]
このように、\(\Delta K_t\) の符号によって、選択した複雑さ尺度における更新方向を区別できる。
\[
\begin{cases}
\Delta K_t>0 & \text{尺度が増加する場合}\\
\Delta K_t<0 & \text{尺度が減少する場合}\\
\Delta K_t=0 & \text{尺度の値が同じ場合}
\end{cases}
\]
ただし、\(\Delta K_t=0\) は、構造が変化していないことを意味するとは限らない。例えば、あるエッジを一本削除すると同時に、別のエッジを一本追加した場合、エッジ数は変化しない。しかし、接続先が変更されているため、グラフそのものは異なる。
この違いを表すため、構造振幅 \(A_t\) と複雑さの差分 \(\Delta K_t\) を組み合わせる。前者は構造がどの程度異なるかを表し、後者は選択した複雑さ尺度がどちらの方向へ変化したかを表す。二つの指標を併用することで、同じエッジ数を維持した再編成も識別できる。
8.4. 四つの部品を持つグラフで計算する
第6.2節で定義した受付 A、入力検証 B、処理 C、結果の記録 D と六つの候補エッジを引き継ぐ。時刻 0 の通常経路に対し、時刻 1 では B から D への記録経路を追加し、時刻 2 では B から C への関係を削除して A から C への関係を追加した。対応する埋め込みベクトルは次のとおりである。
\[
\begin{aligned}
x_0&=(1,0,1,0,1,0)\\
x_1&=(1,0,1,1,1,0)\\
x_2&=(1,1,0,1,1,0)
\end{aligned}
\]
時刻 3 では、記録方式の変更によって B から D への専用経路を削除する。
\[
E_3=\{(A,B),(A,C),(C,D)\}
\]
\[
x_3=(1,1,0,0,1,0)
\]
時刻 4 では、新しい監査上の要求が発生したため、B から D への経路を再び追加する。
\[
E_4=\{(A,B),(A,C),(B,D),(C,D)\}
\]
\[
x_4=(1,1,0,1,1,0)
\]
この例では、時刻 0 から時刻 4 までに四回の構造更新が行われている。それぞれの更新について、構造振幅とエッジ数の増減を計算する。
最初に、時刻 0 から時刻 1 への更新を考える。二つのベクトルの差は、次のようになる。
\[
x_1-x_0=(0,0,0,1,0,0)
\]
四番目の成分だけが変化しているため、構造振幅は 1 となる。
\[
A_1=\sqrt{1^2}=1
\]
エッジ数は三本から四本へ増加しているため、複雑さの差分は次のようになる。
\[
\Delta K_1=4-3=1
\]
この更新では、\(A_1=1\)、\(\Delta K_1=1\) である。構造振幅が 1 であり、エッジ数が一本増加したことが分かる。
続いて、時刻 1 から時刻 2 への更新を考える。B から C への関係が削除され、A から C への関係が追加されているため、二つの成分が変化する。
\[
x_2-x_1=(0,1,-1,0,0,0)
\]
構造振幅は、次のようになる。
\[
A_2=\sqrt{1^2+(-1)^2}=\sqrt{2}
\]
一方、エッジ数は四本のままである。
\[
\Delta K_2=4-4=0
\]
この更新では、構造振幅が約 1.414 であるにもかかわらず、複雑さの差分はゼロである。エッジの追加と削除が同時に発生したため、関係数は変化していない。しかし、接続先の変更という構造更新は確かに発生している。
時刻 2 から時刻 3 への更新では、B から D への経路が削除される。
\[
x_3-x_2=(0,0,0,-1,0,0)
\]
構造振幅は、次のようになる。
\[
A_3=1
\]
エッジ数は四本から三本へ減少する。
\[
\Delta K_3=3-4=-1
\]
時刻 0 から時刻 1 への更新と、時刻 2 から時刻 3 への更新は、どちらも構造振幅が 1 である。しかし、前者ではエッジが追加され、後者では削除されている。構造振幅が等しくても、更新方向は反対になる。
時刻 3 から時刻 4 への更新では、B から D への経路が再び追加される。
\[
x_4-x_3=(0,0,0,1,0,0)
\]
したがって、構造振幅と複雑さの差分は次のようになる。
\[
A_4=1
\]
\[
\Delta K_4=4-3=1
\]
各時点の計算結果を整理すると、次のようになる。
| 時刻 | 構造の変更 | エッジ数 \(K(S_t)\) | 構造振幅 \(A_t\) | 差分 \(\Delta K_t\) |
|---|---|---|---|---|
| \(t=0\) | 初期構造を記録する。 | 3 | 初期状態のため定義しない。 | 初期状態のため定義しない。 |
| \(t=1\) | B から D への関係を追加する。 | 4 | \(1\) | \(+1\) |
| \(t=2\) | B から C への関係を削除し、A から C への関係を追加する。 | 4 | \(\sqrt{2}\) | \(0\) |
| \(t=3\) | B から D への関係を削除する。 | 3 | \(1\) | \(-1\) |
| \(t=4\) | B から D への関係を再び追加する。 | 4 | \(1\) | \(+1\) |
この表では、構造振幅と更新方向が異なる情報を表していることを確認できる。時刻 1、3、4 では構造振幅がすべて 1 であるが、エッジ数の増減方向は一致していない。また、時刻 2 では構造振幅が正であるにもかかわらず、エッジ数は変化していない。
構造の更新を数値で記録する際に、構造振幅だけを使用すると、これらの違いが失われる。一方、エッジ数の増減だけを使用すると、時刻 2 のような関係の付け替えを見落とす。二つの指標を組み合わせることで、更新量と更新方向を分離して把握できる。
8.5. エッジの追加本数と削除本数から二つの指標を導く
エッジの有無を二値ベクトルで表す場合、構造振幅とエッジ数の差分の関係を、さらに詳しく導くことができる。
時刻 \(t-1\) から時刻 \(t\) までに追加されたエッジの本数を \(a_t\)、削除されたエッジの本数を \(r_t\) とする。追加されたエッジは、更新後の関係集合に含まれ、更新前の関係集合には含まれない。削除されたエッジは、その逆である。
\[
a_t=|E_t\setminus E_{t-1}|
\]
\[
r_t=|E_{t-1}\setminus E_t|
\]
\(\setminus\) は集合の差を表す記号である。第一の式は新しく追加されたエッジの本数、第二の式は削除されたエッジの本数を表す。
固定されたエッジ候補について、存在の有無を 0 と 1 で記録し、ユークリッド距離を使用する場合、追加されたエッジも削除されたエッジも、距離の二乗に 1 ずつ寄与する。そのため、構造振幅の二乗は、追加本数と削除本数の合計になる。
\[
A_t^2=a_t+r_t
\]
一方、エッジ数の差分は、追加本数から削除本数を引いた値になる。
\[
\Delta K_t=a_t-r_t
\]
二つの式は、同じ構造更新について異なる情報を表している。構造振幅の二乗は、変更されたエッジの総数である。複雑さの差分は、追加と削除の差である。
例えば、一本のエッジを追加し、一本のエッジを削除した場合には、\(a_t=1\)、\(r_t=1\) となる。
\[
A_t^2=1+1=2
\]
\[
\Delta K_t=1-1=0
\]
この場合、構造振幅は \(\sqrt{2}\) である一方、エッジ数の差分はゼロになる。時刻 1 から時刻 2 への更新が、この条件に該当する。
さらに、二つの式を組み合わせると、構造振幅とエッジ数の差分から、追加本数と削除本数を求められる。
まず、二つの式を足す。
\[
A_t^2+\Delta K_t=2a_t
\]
したがって、追加されたエッジの本数は次のようになる。
\[
a_t=\frac{A_t^2+\Delta K_t}{2}
\]
次に、構造振幅の二乗からエッジ数の差分を引く。
\[
A_t^2-\Delta K_t=2r_t
\]
したがって、削除されたエッジの本数は次のようになる。
\[
r_t=\frac{A_t^2-\Delta K_t}{2}
\]
この関係は、固定されたエッジ候補の有無を二値ベクトルとして表現し、ユークリッド距離を採用した場合に成立する。重みの変化を含む場合や、異なる埋め込み写像を採用する場合には、同じ式がそのまま成立するとは限らない。
時刻 1 から時刻 2 への更新では、\(A_2^2=2\)、\(\Delta K_2=0\) であるため、追加本数と削除本数は次のように求められる。
\[
a_2=\frac{2+0}{2}=1
\]
\[
r_2=\frac{2-0}{2}=1
\]
この計算は、実際に行った一本のエッジ追加と一本のエッジ削除に一致する。
また、追加本数と削除本数はいずれも非負であるため、次の不等式が成立する。
\[
|\Delta K_t|\le A_t^2
\]
左辺の \(|\Delta K_t|\) はエッジ数の増減の絶対値、右辺の \(A_t^2\) は変更されたエッジの総数である。追加本数と削除本数の差の絶対値は、その合計を超えない。この不等式は、エッジ数の純増減が、実際に変更されたエッジの総数以下となることを表している。
例えば、エッジを三本追加し、二本削除した場合には、追加と削除を合わせて五本が変更される。しかし、エッジ数の増加は一本だけである。
\[
A_t^2=3+2=5
\]
\[
\Delta K_t=3-2=1
\]
この場合、構造振幅は \(\sqrt{5}\) であり、エッジ数の増加は 1 となる。構造更新の規模が大きい場合でも、追加と削除が相殺されれば、エッジ数の純増減は小さくなる。
構造振幅とエッジ数の差分を組み合わせることには、このような数理的な意味がある。構造振幅は変更の総量を表し、差分は追加と削除の収支を表す。二値のエッジ表現という条件の下では、両者から追加本数と削除本数まで求められる。
8.6. 更新方向の反転を数式で判定する
構造の更新方向が時間とともに交代するかを調べるには、複雑さの差分の符号を時系列で比較する。例えば、ある時点ではエッジ数が増加し、その次の時点では減少した場合、エッジ数という尺度において更新方向が反転したといえる。
時刻 \(t-1\) の差分を \(\Delta K_{t-1}\)、時刻 \(t\) の差分を \(\Delta K_t\) とする。二つの差分がともにゼロ以外であり、符号が反対である場合、その積は負になる。
\[
\Delta K_t\Delta K_{t-1}<0
\]
この不等式は、隣接する二回の更新で、複雑さの増減方向が反転したことを表す。
例えば、前の更新でエッジ数が一本増加し、現在の更新で一本減少した場合には、次のようになる。
\[
\Delta K_{t-1}=1,\qquad \Delta K_t=-1
\]
二つの差分の積は、次のように計算できる。
\[
\Delta K_t\Delta K_{t-1}=(-1)\times1=-1
\]
積が負であるため、エッジ数の増加から減少への反転が確認できる。反対に、前の更新で減少し、現在の更新で増加した場合も、積は負になる。
先ほどの四つの部品を持つ例では、時刻 3 と時刻 4 の差分が次のようになっている。
\[
\Delta K_3=-1,\qquad \Delta K_4=1
\]
したがって、次の関係が成立する。
\[
\Delta K_4\Delta K_3=1\times(-1)=-1<0
\]
この例では、時刻 3 にエッジを削除した後、時刻 4 に再び追加しているため、エッジ数の増減方向が反転している。
ただし、差分がゼロの場合には、単純な符号の積だけでは方向反転を判定できない。例えば、エッジ数が増加した後、同数のエッジを付け替え、その後にエッジ数が減少した場合、差分は正、ゼロ、負の順に並ぶ。
\[
\Delta K_{t-2}>0,\qquad
\Delta K_{t-1}=0,\qquad
\Delta K_t<0
\]
この場合、隣接する差分の積はゼロとなるため、先ほどの不等式では反転を検出しない。しかし、ゼロの差分を挟んで、エッジ数の増加から減少へ移行していることは確認できる。
そこで、更新方向の反転をどのように数えるかは、分析目的に応じて定義する必要がある。隣接する二時点の差分に限定する場合には、ゼロを挟む変化を反転として数えない。一方、ゼロ以外の差分を順に取り出して符号を比較する方法なら、途中でエッジ数が維持された場合でも、増減方向の交代を検出できる。
ただし、差分がゼロの時点で構造が変化していないとは限らない。時刻 2 のように、エッジを一本追加すると同時に別の一本を削除した場合には、エッジ数の差分がゼロでも構造振幅は正になる。そのため、ゼロの差分を除外して更新方向を比較する場合にも、構造が維持されていた時点と、関係の付け替えが発生した時点を区別しておく必要がある。
また、更新方向の反転が一度観測されたことと、周期的な振動が成立していることは別の性質である。例えば、エッジ数が一度増加した後に減少し、そのまま一定の値で維持される場合、方向反転は観測される。しかし、その後に同じ更新が繰り返されるとは限らない。
周期性を確認するには、状態そのもの、あるいは選択した尺度の値が一定の間隔で反復されるかを調べる必要がある。更新方向の反転回数や反転間隔は、その分析に利用できる情報の一部であるが、反転の存在だけで周期性が保証されるわけではない。
8.7. 複雑さの尺度によって更新方向の判定は異なる
ここまでの計算では、エッジ数を複雑さの尺度として使用した。しかし、構造の複雑さは一つの指標だけで完全に表現できるとは限らない。特にソフトウェアでは、関係の総数だけでなく、特定の部品への依存の集中、処理経路の長さ、例外条件の数、保守に必要な作業量なども構造の性質に関係する。
例えば、ある部品が多数の部品から呼び出される場合を考える。その部品の変更によって広い範囲の動作確認が必要になるなら、依存関係の集中が保守費用に影響する可能性がある。一方、同じ本数の関係が独立した部品へ分散していれば、変更の影響範囲は異なる場合がある。
この違いを測定するには、エッジ数とは別に、依存関係の集中度を表す尺度を定義する必要がある。例えば、各ノードへ入ってくるエッジの本数を入次数と呼ぶ。最大入次数を指標とすれば、最も多くの呼び出し元を持つ部品が、どの程度の関係を受けているかを表せる。
グラフ \(S\) のノード \(v\) の入次数を \(\deg^-(v)\) とする。このとき、最大入次数を表す尺度は次のように定義できる。
\[
K_{\mathrm{in}}(S)=\max_{v\in V}\deg^-(v)
\]
\(\max\) は最大値を取る操作である。この式は、すべてのノードについて入次数を調べ、その中で最も大きい値を返す。例えば、四つのノードの入次数がそれぞれ 0、1、1、3 であれば、最大入次数は 3 になる。
この指標では、エッジ数が同じでも、特定のノードへ関係が集中することで値が増加する場合がある。反対に、関係の総数を維持しながら接続先を分散させれば、最大入次数が減少する場合がある。
ただし、最大入次数が大きいことが、必ずしも設計上の欠陥を意味するわけではない。共通の記録機能や認証機能など、多数の部品から利用されることを意図した部品も存在する。集中度を測定できることと、その集中が運用上望ましいかどうかを判断できることは異なる。
複数の尺度を比較する場合、エッジ数を \(K_{\mathrm{edge}}\)、最大入次数を \(K_{\mathrm{in}}\) とすれば、それぞれの差分を次のように表せる。
\[
\Delta K_{\mathrm{edge},t}
=K_{\mathrm{edge}}(S_t)-K_{\mathrm{edge}}(S_{t-1})
\]
\[
\Delta K_{\mathrm{in},t}
=K_{\mathrm{in}}(S_t)-K_{\mathrm{in}}(S_{t-1})
\]
ある更新によってエッジ数が増加する一方、依存関係がより分散され、最大入次数が減少する場合も考えられる。この場合、二つの尺度は反対方向へ変化する。
\[
\Delta K_{\mathrm{edge},t}>0,\qquad
\Delta K_{\mathrm{in},t}<0
\]
この結果は矛盾ではない。エッジ数という性質は増加し、最大入次数という別の性質は減少しているためである。構造全体を一つの「複雑化」または「単純化」という言葉だけで評価すると、どの性質が増減したのかが不明確になる。
実際の構造更新では、複数の尺度を組み合わせて評価する場合がある。その場合には、尺度ごとに測定対象と単位を明示し、必要に応じて別々に比較する。複数の尺度を一つの値へ統合する場合には、各尺度への重みづけを定める必要がある。その重みづけ自体も、何を優先するかという評価上の判断を含んでいる。
構造振動モデルでは、構造振幅を変化量の共通指標として使用しつつ、更新方向は選択した尺度に対して定義する。この方法によって、構造全体の変更規模と、個別の構造特性の増減を区別できる。
8.8. 振幅の減少から単純化や安定化を判断できるか
構造振幅と更新方向を分離すると、構造振幅が減少した場合の解釈も明確になる。例えば、ある時点の構造振幅が 3、次の時点では 1 となったとする。この場合、採用した距離の定義において、隣接時点間の構造差が小さくなったことは確認できる。
\[
A_{t+1}<A_t
\]
しかし、この不等式だけでは、構造が単純化したことまでは分からない。例えば、最初の更新で多数のエッジを削除し、次の更新で一本のエッジを追加した場合、構造振幅は減少していても、二回目の更新方向はエッジ数の増加となる。
反対に、最初の更新で多数のエッジを追加し、次の更新で一本だけ削除した場合も、構造振幅は減少する。二つの例では更新方向が異なるが、振幅の減少という観測結果は共通している。
また、構造振幅が小さくなったことは、運用上の安定性が改善したことを直接意味しない。例えば、一本の重要な依存関係を削除したことで障害が発生する場合、構造振幅が 1 であっても、運用への影響が大きくなる可能性がある。一方、複数の不要な経路をまとめて削除し、障害の発生を抑えた場合には、構造振幅が大きくても運用上の安定性が改善する場合がある。
さらに、構造振幅がゼロへ近づくことと、構造の状態が特定の状態へ収束することも区別される。隣接する状態の差が小さくなり続けても、同じ方向への小さな更新が累積すれば、初期状態からの距離は増加し続ける可能性がある。
構造の安定性を数理的に判断するには、構造振幅の推移だけでなく、状態全体の軌道や基準構造との距離を分析する必要がある。また、運用上の安定性については、障害頻度、復旧時間、機能維持など、構造以外の観測結果も必要となる。
8.9. 構造振幅と更新方向を組み合わせた分析
構造振動モデルでは、構造の更新量を測定することと、更新方向を測定することを別々の操作として定義できる。構造振幅 \(A_t\) は、採用した構造表現と距離の下で、隣接する二つの状態がどの程度異なるかを表す。一方、複雑さの差分 \(\Delta K_t\) は、選択した尺度が増加したか、減少したかを表す。
両者を組み合わせたときに得られる情報を整理すると、次のようになる。
| 観測結果 | 数学的な意味 | 判断できる範囲 |
|---|---|---|
| \(A_t=0\) | 埋め込み後のベクトルが前時点と一致している。 | 採用した表現では構造差が検出されない。埋め込みが単射でない場合、元の構造全体の同一性は保証されない。 |
| \(A_t>0\) | 埋め込み後のベクトルに差が存在する。 | 採用した表現で構造更新が検出される。更新方向や運用上の効果は別に評価する。 |
| \(\Delta K_t>0\) | 選択した複雑さ尺度が増加している。 | その尺度上で増加方向の更新が生じている。 |
| \(\Delta K_t<0\) | 選択した複雑さ尺度が減少している。 | その尺度上で減少方向の更新が生じている。 |
| \(\Delta K_t=0\)、\(A_t>0\) | 複雑さ尺度の値を維持したまま、構造表現が変化している。 | 関係の付け替えなど、純増減を伴わない再編成を検出できる。 |
| \(\Delta K_t\Delta K_{t-1}<0\) | 隣接する二回の更新で、複雑さ尺度の増減方向が反転している。 | 選択した尺度上の方向反転を確認できる。周期性や反転の原因は別の条件を必要とする。 |
| \(A_{t+1}<A_t\) | 隣接時点間の構造変化量が減少している。 | 振幅の減少を確認できる。状態の収束や運用上の安定化は保証されない。 |
この表から、構造振幅と更新方向が異なる情報を担っていることが分かる。構造振幅が正であっても、複雑さの差分がゼロになる場合がある。また、同じ構造振幅であっても、複雑さの差分が正になる場合と負になる場合がある。構造の変更規模と、複雑さの増減方向を一つの数値だけで表現することには限界がある。
さらに、複雑さの差分の符号が反転した場合でも、その変化を生んだ原因は差分の値だけでは分からない。例えば、障害の発生によって経路を追加し、運用費用の増大によって経路を削除した場合と、組織上の責任変更によって同じ追加と削除を行った場合では、構造振幅とエッジ数の増減が一致する可能性がある。しかし、それぞれの変更を選択した条件は異なる。
そのため、構造更新の原因を分析するには、構造振幅と更新方向に加えて、環境条件、観測結果、介入、更新規則を対応づける必要がある。状態遷移方程式で定義した \(C_t\)、\(O_t\)、\(U_t\)、\(M\) は、そのための情報を表している。
例えば、同じエッジ追加であっても、未知の要求に備えた拡張なのか、障害報告を受けた修正なのかによって、更新の目的が異なる。構造振幅は追加された関係の数や大きさを測定し、更新方向の指標は関係数の増加を示す。一方、その追加がなぜ合理的と判断されたかは、環境、観測、更新規則との関係から説明される。
構造振動モデルで複雑化と単純化の交代を論じる際にも、同じ区別が必要になる。構造振幅の推移は変更量を表し、複雑さの差分の推移は選択した尺度上の増減方向を表す。さらに、更新写像を通じて、その方向がどの条件によって選択されたかを記述できる。
構造振動モデルが扱う構造更新は、関係の追加や削除が発生したという事実だけで完結するものではない。どのような規則で構造差を測定し、どの尺度で更新方向を評価し、どの環境条件と観測結果によってその更新が選択されたかを対応づけることで、複雑化、単純化、関係の付け替えを同じ数理的な枠組みで分析できる。
9. 振幅の減衰と構造の安定性を区別する
ソフトウェアの構造変更が頻繁に発生していた時期を経て、変更の規模が次第に小さくなることがある。例えば、最初は多数の依存関係を変更していたシステムで、運用開始後には一度に変更する関係が少なくなり、最終的にはほとんど変更が発生しなくなる場合である。このような経過を見ると、構造が安定したと判断したくなる。
しかし、構造の更新量が小さくなることと、構造そのものが特定の状態へ近づくことは、数学的に異なる性質である。小さな変更を繰り返していても、同じ方向への変更が累積すれば、初期構造から大きく離れる場合がある。また、構造が一定の範囲に収まっていても、二つの状態を繰り返し行き来している場合には、単一の状態へ収束しているとはいえない。
構造振動モデルで安定性を論じるには、少なくとも、隣接時点間の更新量、構造の状態そのものの推移、許容する構造の範囲、運用上の要求を区別する必要がある。特に、振幅の減衰から状態の収束を導くには、どのような数学的条件が必要なのかを明らかにすることが重要になる。
9.1. 更新量が小さくなることと状態が収束すること
構造振動モデルでは、時刻 \(t\) の構造を \(S_t\)、その一つ前の時点の構造を \(S_{t-1}\) とする。構造間の距離を \(d\) とすると、構造振幅は次のように定義される。
\[
A_t=d(S_t,S_{t-1})
\]
埋め込み写像 \(\phi\) によって構造をベクトルへ変換し、ユークリッド距離を使用する場合には、次のようになる。
\[
A_t=\|\phi(S_t)-\phi(S_{t-1})\|_2
\]
この式は、時刻 \(t-1\) から時刻 \(t\) までに、採用した構造表現がどの程度変化したかを表す。構造振幅が大きければ、隣接する時点の構造差が大きい。構造振幅が小さければ、その二つの時点の構造差は小さい。
時間とともに構造振幅がゼロへ近づく性質を、次のように表す。
\[
A_t\longrightarrow0\qquad(t\longrightarrow\infty)
\]
記号 \(\longrightarrow\) は、時刻を進めると値が指定された値へ近づくことを表す。この式は、十分に時刻が進めば、隣接時点間の構造差を任意に小さくできるという意味である。各時点の構造変更が次第に小さくなる性質を、ここでは振幅の減衰と呼ぶ。
一方、構造の収束とは、ある一定の構造へ状態が近づくことである。構造の埋め込みベクトルを \(x_t=\phi(S_t)\) とし、収束先のベクトルを \(x^\ast\) とすると、次の条件で表せる。
\[
\|x_t-x^\ast\|_2\longrightarrow0
\]
\(x^\ast\) は、時間が十分に経過したときに状態が近づく基準点である。この式では、一つ前の時点との距離ではなく、固定された基準点との距離を測定している。
振幅の減衰と状態の収束は、比較する相手が異なる。振幅の減衰では、毎回一つ前の状態と比較する。状態の収束では、時刻によって動かない同じ基準点と比較する。隣接する状態が近くなったとしても、状態が同じ基準点へ近づいているとは限らない。
例えば、毎回 1 だけ増加する数列を考える。
\[
x_t=t
\]
この系列では、隣接時点間の距離は常に 1 である。
\[
|x_t-x_{t-1}|=1
\]
状態は一方向へ増加し続けるため、有限の値へ収束しない。この例では振幅も減衰していない。しかし、更新量を時間とともに小さくした場合でも、状態が収束しない例を作ることができる。
9.2. 振幅がゼロへ近づいても状態が発散する例
構造を一次元の数値 \(x_t\) で表す場合を考える。一次元とは、構造の状態を一つの実数で記録することである。ここでは、状態が取り得る値を実数全体とし、二つの状態の距離を差の絶対値で測定する。
時刻 \(t\) における状態を、次のように定義する。
\[
x_t=\log(t+1),\qquad t=0,1,2,\ldots
\]
\(\log\) は自然対数を表す。\(t\) はゼロ以上の整数であり、\(t=0\) では \(\log1=0\) となる。この数列は、時刻が進むにつれて増加するが、増加の割合は次第に小さくなるという性質を持つ。
実際に最初の値を計算すると、次のようになる。
\[
\begin{aligned}
x_0&=\log1=0\\
x_1&=\log2\approx0.693\\
x_2&=\log3\approx1.099\\
x_3&=\log4\approx1.386\\
x_4&=\log5\approx1.609
\end{aligned}
\]
時刻 0 から時刻 1 への増加量は約 0.693 である。時刻 1 から時刻 2 への増加量は約 0.405、時刻 2 から時刻 3 への増加量は約 0.288 となる。増加量は次第に小さくなっているが、状態の値は増加し続けている。
一般の時刻 \(t\ge1\) について、隣接時点間の距離を計算する。
\[
A_t=|x_t-x_{t-1}|
\]
数列の定義を代入すると、次のようになる。
\[
A_t=|\log(t+1)-\log t|
\]
自然対数には、二つの正の数について、対数の差を比の対数へ変換できる性質がある。
\[
\log a-\log b=\log\left(\frac{a}{b}\right)
\]
この性質を利用すると、構造振幅は次のように整理できる。
\[
A_t=\log\left(\frac{t+1}{t}\right)
\]
分数の分子を \(t+1\) としているため、比は常に 1 より大きい。したがって、対数の値は正となり、絶対値を外すことができる。
さらに、分数を次のように書き換える。
\[
A_t=\log\left(1+\frac{1}{t}\right)
\]
時刻 \(t\) が大きくなると、\(1/t\) はゼロへ近づく。そのため、対数の中身は 1 へ近づく。自然対数は 1 でゼロとなるため、構造振幅は次のように収束する。
\[
\lim_{t\to\infty}A_t=0
\]
一方、状態そのものは次のようになる。
\[
\lim_{t\to\infty}x_t
=\lim_{t\to\infty}\log(t+1)
=\infty
\]
つまり、隣接時点間の構造差はゼロへ近づくが、状態はどこまでも増加し続ける。構造振幅の減衰と、状態の収束が一致しないことを示す反例である。
この関係を、最初のいくつかの時点について整理すると、次のようになる。
| 時刻 \(t\) | 状態 \(x_t\) | 振幅 \(A_t\) | 状態の推移 |
|---|---|---|---|
| 0 | \(0\) | 初期状態のため定義しない。 | 基準となる初期状態である。 |
| 1 | 約 \(0.693\) | 約 \(0.693\) | 状態が増加する。 |
| 2 | 約 \(1.099\) | 約 \(0.405\) | 増加量は小さくなるが、状態は増加する。 |
| 3 | 約 \(1.386\) | 約 \(0.288\) | 増加量はさらに小さくなる。 |
| 4 | 約 \(1.609\) | 約 \(0.223\) | 状態は増加を続ける。 |
この表では、各時点の振幅が小さくなる一方、状態そのものは初期値から離れ続けている。振幅だけを観測すれば、更新が小さくなっていると判断できる。しかし、状態の値を同時に記録すれば、一方向への移動が継続していることが分かる。
構造振動モデルにおいても、同じ区別が必要になる。例えば、依存関係の重みを連続値として表現する場合、各時点で重みを少しずつ増やし、その増加量を次第に小さくすることが考えられる。重みの増加が累積するなら、隣接時点間の構造振幅が減衰しても、構造が特定の状態へ収束するとは限らない。
ただし、この反例は、状態が無限に多くの値を取れる空間を前提としている。固定された有限個のエッジ候補について、存在の有無だけを記録する二値グラフとは、状態空間の性質が異なる。この違いも、構造の収束を判断する際には考慮する必要がある。
9.3. 有限の二値グラフでは振幅の減衰が持つ意味が異なる
前述の反例では、状態を一つの実数として表し、値が連続的に増加することを認めていた。一方、ソフトウェアの呼び出し関係の有無を二値ベクトルで表す場合、各成分は 0 または 1 しか取らない。
例えば、六つのエッジ候補を固定し、それぞれの有無を記録する場合を考える。構造の埋め込みベクトルは、次のような六次元の二値ベクトルとなる。
\[
x_t=(b_{1,t},b_{2,t},b_{3,t},b_{4,t},b_{5,t},b_{6,t})
\]
各成分 \(b_{i,t}\) は、対応するエッジが存在する場合には 1、存在しない場合には 0 を取る。
\[
b_{i,t}\in\{0,1\}
\]
この条件では、構造として取り得るベクトルは有限個である。六つのエッジ候補について、それぞれ存在するか存在しないかという二つの選択肢があるため、候補構造の総数は次のようになる。
\[
2^6=64
\]
六つの候補関係に制限を加えなければ、64 通りの二値ベクトルを構成できる。実際の設計上の制約によって認められる構造が減る場合はあるが、状態の候補が有限であることは変わらない。
この二値ベクトルにユークリッド距離を使用すると、異なる構造間の距離には正の最小値が存在する。一つのエッジだけが異なる場合の距離が 1 であり、複数のエッジが異なる場合には、それ以上の距離となるためである。
したがって、隣接する二つの構造が異なる場合、構造振幅は必ず 1 以上となる。
\[
S_t\neq S_{t-1}\ \Longrightarrow\ A_t\ge1
\]
ここでは、六つのエッジ候補の有無によって構造が完全に定義され、異なる構造が異なるベクトルとして表現されるものとする。
この条件の下で、構造振幅がゼロへ収束する場合を考える。
\[
A_t\longrightarrow0
\]
ゼロへの収束が成立するなら、十分に時刻が進んだ後には、構造振幅が 1 より小さくなる。ところが、異なる二値ベクトル間の距離は必ず 1 以上である。そのため、振幅が 1 より小さい時点では、二つのベクトルが同一でなければならない。
つまり、ある時刻 \(T\) が存在し、それ以降は次の関係が成立する。
\[
\forall t\ge T:\quad A_t=0
\]
構造の違いがすべて二値ベクトルに保持されているため、この条件は次の関係を意味する。
\[
\forall t\ge T:\quad S_t=S_{t-1}
\]
すなわち、固定された有限個のエッジ候補について、存在の有無だけを記録する場合には、構造振幅がゼロへ収束すれば、ある時点以降は構造が完全に変化しなくなる。
これは、実数値の状態に対して示した \(x_t=\log(t+1)\) の反例とは異なる性質である。実数値の状態では、どれほど小さな正の変更量も取り得るため、変更量を小さくしながら更新を継続できる。一方、有限の二値グラフでは、一つのエッジを変更するために必要な距離が正の値として残る。変更量を無限に小さくし続けることはできず、最終的には変更が停止する。
ただし、この結論は、エッジ候補の集合を固定し、二値の有無だけを測定し、構造間距離に正の最小値が存在することを前提としている。エッジの重みが連続値を取る場合や、新しいノードやエッジ候補が増え続ける場合には、同じ結論をそのまま適用できない。
また、埋め込み写像が異なる構造を同じベクトルへ写す場合には、振幅がゼロでも実際の構造変更が隠れている可能性がある。例えば、ノード数とエッジ数だけを記録する埋め込みでは、接続先の付け替えが発生しても距離がゼロになる場合がある。その場合、ベクトルが一定になったことから元のグラフが一定になったとは結論できない。
構造振幅の減衰が状態の収束を保証するかどうかは、測定対象となる構造空間と距離の性質によって異なる。この点を明示することによって、連続値の重みを持つ構造と、有限の二値関係だけを持つ構造を混同せずに分析できる。
9.4. 更新量の総和が有限なら状態の収束を導ける
実数値の状態や連続的な重みを持つ構造では、隣接時点間の距離がゼロへ近づくことだけでは収束を保証できない。しかし、構造振幅に追加の条件を課すことで、状態の収束を導くことができる。
その一つが、構造振幅の総和が有限であるという条件である。時刻 1 から無限に先までの構造振幅を合計し、その値が有限に収まるとする。
\[
\sum_{t=1}^{\infty}A_t<\infty
\]
\(\sum\) は合計を表す記号である。この式は、時刻 1 以降の各更新で生じた構造振幅をすべて足し合わせても、有限の値に収まることを意味する。更新のたびに構造が少しずつ変化していても、その変化量の合計が一定の範囲に収まるという条件である。
なぜこの条件から収束を導けるのかを確認する。構造の埋め込みベクトルを \(x_t=\phi(S_t)\) とする。時刻 \(n\) と、それより後の時刻 \(m\) を比較する。ただし \(m>n\) とする。
二つの時点の状態差は、途中の更新差を合計することで表せる。
\[
x_m-x_n
=\sum_{k=n+1}^{m}(x_k-x_{k-1})
\]
この式は、時刻 \(n\) から時刻 \(m\) までの間に発生した各更新を順に足し合わせると、最初と最後の状態差になることを表す。
例えば、時刻 2 から時刻 5 までの差を計算する場合には、次のようになる。
\[
x_5-x_2
=(x_3-x_2)+(x_4-x_3)+(x_5-x_4)
\]
右辺では、途中に現れる \(x_3\) と \(x_4\) の正負の項が相殺され、最初と最後の状態差だけが残る。
次に、距離の性質を利用する。ユークリッド距離には、二つの点の直接距離が、途中の点を経由した距離の合計を超えないという三角不等式が成立する。
この性質を繰り返し適用すると、次の不等式が得られる。
\[
\|x_m-x_n\|_2
\le\sum_{k=n+1}^{m}\|x_k-x_{k-1}\|_2
\]
右辺の各項は構造振幅 \(A_k\) に等しいため、次のように書ける。
\[
\|x_m-x_n\|_2
\le\sum_{k=n+1}^{m}A_k
\]
この不等式は、時刻 \(n\) から時刻 \(m\) までの直接距離が、その間に発生した各更新量の合計以下になることを表している。
ここで、構造振幅の総和が有限であるという仮定を使用する。無限級数の合計が有限に収まる場合、十分に後の時点から先の項だけを合計した値は、任意に小さくできる。
つまり、時刻 \(n\) を十分に大きくすれば、\(m>n\) をどれだけ先に取っても、次の値を小さくできる。
\[
\sum_{k=n+1}^{m}A_k
\]
したがって、時刻 \(n\) と、それより後の任意の時刻 \(m\) の状態間距離も小さくなる。
\[
\|x_m-x_n\|_2\longrightarrow0
\]
ここでの極限は、\(m>n\) のすべての組について、\(n\) を十分大きくすると距離を任意に小さくできるという意味である。このような性質を持つ数列をコーシー列と呼ぶ。
コーシー列とは、十分に後の二つの項を選べば、それらの間の距離を任意に小さくできる数列である。単に隣接する二項の距離が小さいという条件よりも強く、遠く離れた時点同士の状態も近くなることを要求する。
実数の有限次元ベクトル空間 \(\mathbb{R}^{n}\) は完備である。完備とは、その空間の中で定義されたすべてのコーシー列が、同じ空間の中のある点へ収束する性質である。
したがって、構造の埋め込みベクトルが共通の \(\mathbb{R}^{n}\) に存在し、構造振幅の総和が有限であれば、あるベクトル \(x^\ast\) が存在して、次の関係が成立する。
\[
x_t\longrightarrow x^\ast
\]
この結果によって、構造振幅の総和が有限であることは、埋め込みベクトルの収束を保証する十分条件となる。
ただし、この条件は十分条件であって、必要条件ではない。状態が収束する数列であっても、途中で左右に小さく移動することを繰り返せば、各更新量の合計が無限大になる場合がある。したがって、総和が有限でなければ収束しないという意味ではない。
また、この議論で直接保証されるのは、埋め込みベクトル \(x_t\) の収束である。元のグラフ構造 \(S_t\) が特定の構造へ収束することまで主張するには、埋め込み写像が構造の違いを適切に保持していることや、収束先のベクトルが実際に認められる構造に対応することを確認する必要がある。
例えば、構造の特徴量をノード数とエッジ数だけに限定した場合、埋め込みベクトルが収束していても、エッジの接続先が変更され続ける可能性がある。埋め込みが保持していない情報については、ベクトルの収束から結論を導けない。
9.5. 振幅の総和と初期状態からの距離
構造振幅の総和が有限であるという条件は、初期状態からの累積的な変化を考える際にも意味を持つ。
時刻 0 の状態を \(x_0\)、時刻 \(N\) の状態を \(x_N\) とすると、三角不等式から次の関係が成立する。
\[
\|x_N-x_0\|_2
\le\sum_{t=1}^{N}A_t
\]
左辺は、初期状態と時刻 \(N\) の状態の間の直接距離である。右辺は、途中の各更新量を合計した値である。これは、各時点で構造が移動した距離の合計が、最初と最後の直接距離以上になることを意味する。
例えば、ある構造が一度大きく変更され、その後に元の構造へ戻った場合を考える。この場合、初期状態から最終状態までの直接距離はゼロになる可能性がある。しかし、途中で構造変更と切り戻しが発生していれば、構造振幅の合計は正の値になる。
一方、同じ方向へ変更を続けた場合には、初期状態からの距離が増加する可能性がある。振幅の総和が有限であれば、その累積的な変化には上限が与えられる。
前述の \(x_t=\log(t+1)\) の例では、構造振幅の総和を実際に計算できる。
\[
\sum_{t=1}^{N}A_t
=\sum_{t=1}^{N}\log\left(\frac{t+1}{t}\right)
\]
対数の和を積の対数へ変換すると、次のようになる。
\[
\sum_{t=1}^{N}A_t
=\log\left(\prod_{t=1}^{N}\frac{t+1}{t}\right)
\]
\(\prod\) は、指定された項をすべて掛け合わせる記号である。この積では、分母と分子に同じ整数が現れるため、途中の項が相殺される。
\[
\prod_{t=1}^{N}\frac{t+1}{t}
=\frac{2}{1}\times\frac{3}{2}\times\cdots\times\frac{N+1}{N}
=N+1
\]
したがって、構造振幅の総和は次のようになる。
\[
\sum_{t=1}^{N}A_t=\log(N+1)
\]
\(N\) を無限に大きくすると、右辺は無限大へ増加する。
\[
\sum_{t=1}^{\infty}A_t=\infty
\]
この数列では、各時点の振幅はゼロへ近づいている。しかし、その振幅を無限に合計すると有限の値には収まらない。小さな更新が累積し、状態が初期位置から離れ続けることを、総和の計算からも確認できる。
この結果は、構造振動モデルで構造の収束を評価する際に、各時点の更新量だけでなく、更新量の累積も考慮する必要があることを示している。振幅の減衰だけを確認する場合と、その総和が有限に収まることまで確認する場合では、数学的に保証できる性質が異なる。
9.6. 周期的な状態は有界でも収束しない場合がある
構造の状態が一定の範囲に収まっていることと、特定の状態へ収束することも区別される。例えば、二つの状態を交互に繰り返す数列を考える。
\[
x_t=(-1)^t
\]
この数列では、偶数時点で \(x_t=1\)、奇数時点で \(x_t=-1\) となる。状態は常に -1 と 1 の間に収まっている。
\[
|x_t|\le1
\]
このように、状態が一定の範囲を超えない性質を有界性と呼ぶ。上の数列は有界であるが、二つの値を交互に取り続けるため、単一の値へは収束しない。
隣接時点間の振幅を計算すると、次のようになる。
\[
A_t=|x_t-x_{t-1}|=2
\]
どの時点でも振幅は 2 であり、ゼロへ減衰しない。しかし、状態の値は常に -1 と 1 の範囲に収まっている。この例は、振幅が減衰しなくても、状態が有限の範囲に留まり続ける場合があることを示している。
構造振動モデルでも、同じ二つの関係構造を交互に選択する状態遷移が考えられる。例えば、ある処理経路を追加した状態と削除した状態が交互に現れる場合、構造振幅は継続して正の値を取り得る。それでも、取り得る構造は一定の範囲に限定されている。
ただし、有界性が成立することだけで、運用上の安定性が保証されるわけではない。例えば、二つの構成を頻繁に切り替えるたびに処理が中断する場合、構造の状態が一定の範囲に留まっていても、サービスの運用は不安定となる可能性がある。構造の有界性と、運用上の障害や復旧時間は、別の観測対象である。
周期的な運動を明示的に扱う研究として、結合振動子の同期を分析する Kuramoto モデルがある[21]。このモデルでは、複数の振動子の位相や相互作用を用いて、同期が生じる条件などを調べる。構造振動モデルと共通するのは、複数の要素間の相互作用を時間に沿って考える点である。ただし、Kuramoto モデルでは振動子の位相が状態変数として与えられるのに対し、構造振動モデルでは構成要素と関係そのものが更新対象となる。両者の状態変数と更新規則は異なる。
複数の要素が相互作用し、環境から得られた情報によって振る舞いを調整するという観点では、複雑適応系の研究も比較対象となる。Holland の議論では、相互作用する要素の適応によって系全体の振る舞いが形成されることが扱われている[22]。構造振動モデルでは、このような適応を論じる場合にも、どの関係が更新され、更新後の構造がどのような観測結果を生むかを具体的に定義する必要がある。
周期性、有界性、収束は、それぞれ別の条件によって判断される。周期性は状態が一定の間隔で繰り返されること、有界性は状態が一定の範囲に収まること、収束は状態が特定の値へ近づくことを表す。構造振動という名称だけから、これらの性質が自動的に成立すると判断することはできない。
9.7. 許容範囲に留まる性質として運用上の安定性を定義する
ソフトウェアの運用では、構造が完全に固定されることよりも、必要な機能を維持しながら一定の条件を満たし続けることが重要となる場合がある。例えば、負荷に応じて処理経路を追加または削除するシステムでは、構造が更新され続けていても、応答時間や障害発生率が許容範囲に収まっていれば、運用上の目的を達成していると評価できる。
このような評価を行うには、安定していると認める条件をあらかじめ定義する必要がある。構造については、ある基準構造 \(S^\ast\) との距離が、許容する値より小さい状態を考えられる。
基準構造 \(S^\ast\) は、比較の基準として選んだ構造である。例えば、動作確認済みの構成、必要な機能を維持できる構成、運用上の制約を満たす構成などが考えられる。ただし、基準構造の選択そのものにも評価上の判断が含まれるため、何を基準としたかを明示する必要がある。
許容する構造間距離を \(\varepsilon\) とすると、時刻 \(t\) の構造が許容範囲内にある条件は、次のようになる。
\[
d(S_t,S^\ast)<\varepsilon
\]
\(\varepsilon\) は正の値であり、どの程度の構造差までを許容するかを表す。例えば、エッジの追加・削除本数に基づく距離を使用する場合には、許容する変更の規模に対応する値として設定できる。
ある時刻以降、構造が常に許容範囲内に留まることを確認したい場合には、次の条件を考える。
\[
\exists T,\ \forall t\ge T:\quad d(S_t,S^\ast)<\varepsilon
\]
記号 \(\exists\) は「存在する」、\(\forall\) は「すべての」を意味する。\(T\) は、構造が許容範囲に入った後、その範囲を維持する時刻の境界を表す。この式は、ある時刻 \(T\) 以降のすべての時点で、構造が基準構造から距離 \(\varepsilon\) 未満の範囲に留まることを意味する。
ただし、\(\varepsilon\) を任意に大きく設定できるだけでは、安定性について十分な情報が得られない。例えば、構造が大きく変更され続けていても、十分に大きな許容距離を選べば、すべての状態をその範囲に含められる場合がある。そのため、実務上の評価では、許容距離を運用上の要件に基づいて先に定めることが重要になる。
また、構造間距離だけで運用上の安定性を判断できるとは限らない。例えば、同じエッジ数の構造でも、重要な処理経路を削除した場合には、正常なサービスを継続できなくなる可能性がある。逆に、多くのエッジを追加した構造であっても、障害の影響を限定できる設計になっていれば、運用上の安定性が改善する場合がある。
そのため、構造の許容範囲に加えて、運用上の要求を別に定義する必要がある。例えば、重要な処理が継続すること、障害からの復旧時間が一定の上限を超えないこと、記録の欠落が許容値以下であることなどが考えられる。
これらを整理すると、次のようになる。
| 評価対象 | 数学的・運用上の条件 | その条件だけでは判断できないこと |
|---|---|---|
| 振幅の減衰 | \(A_t\to0\) が成立する。 | 状態の収束や、初期構造からの累積的な変化は確定しない。 |
| 振幅の総和 | \(\sum_{t=1}^{\infty}A_t<\infty\) が成立する。 | 埋め込みが構造の違いを保持していない場合、元の構造全体の収束までは確定しない。 |
| 状態の収束 | ある \(x^\ast\) について \(\|x_t-x^\ast\|_2\to0\) が成立する。 | 収束先が運用上望ましい構造であることは保証されない。 |
| 状態の有界性 | 状態が一定の有界な範囲に収まる。 | 周期的な切り替えや運用上の障害が発生しないとは限らない。 |
| 構造の許容範囲 | 指定した時刻以降、基準構造との距離が許容値未満に収まる。 | 重要な処理の継続や復旧時間などの運用要件は別に確認する必要がある。 |
| 運用上の安定性 | 必要な機能、障害発生率、復旧時間などについて定めた条件を満たす。 | 構造が固定されていることや、振幅がゼロであることは必須ではない。 |
この表では、構造に関する数学的な性質と、運用上の要求を分けている。構造振幅が小さくなることは更新規模の減少を表す。状態の収束は、構造の数値表現が特定の点へ近づくことを表す。一方、運用上の安定性は、サービスを継続するための条件が満たされているかを評価する。
例えば、構造変更が完全に停止しても、その構造が重要な障害へ対応できなければ、運用上は安定しているとはいえない。反対に、負荷に応じて関係が追加・削除され続けても、必要な処理能力と障害対応能力を維持していれば、運用上の目的を達成している場合がある。
9.8. リアプノフ安定性との違い
数学的な安定性を考える場合には、基準状態の近くから出発した軌道が、その近くに留まり続けるかという性質も重要になる。これは、単一の観測軌道が最終的に許容範囲へ入るかどうかとは異なる問題である。
例えば、ある構造が基準構造 \(S^\ast\) の近くにあり、環境条件がわずかに変化した場合を考える。その変化によって構造が大きく離れてしまうなら、元の構造が安定して見えていても、小さな擾乱に対しては不安定な可能性がある。
このような性質を扱う概念の一つが、リアプノフ安定性である。リアプノフ安定性では、初期状態の小さなずれによって、その後の状態が基準状態から大きく離れないかを調べる。
まず、簡単な離散時間の状態更新を考える。状態を \(x_t\)、更新規則を \(F\) とすると、次のように表せる。
\[
x_{t+1}=F(x_t)
\]
この更新規則の下で、ある状態 \(x^\ast\) が次の条件を満たすとする。
\[
F(x^\ast)=x^\ast
\]
このような状態を固定点という。固定点では、状態が \(x^\ast\) にあるとき、更新規則を一回適用しても同じ状態が得られる。
固定点 \(x^\ast\) のリアプノフ安定性は、任意の許容距離 \(\varepsilon>0\) に対して、適切な初期距離 \(\delta>0\) を選ぶことで、初期状態がその範囲にあるすべての軌道が、以後も許容距離の範囲に留まるという条件で表される。
\[
\forall\varepsilon>0,\ \exists\delta>0:
\quad
\|x_0-x^\ast\|_2<\delta
\Longrightarrow
\forall t\ge0,\ \|x_t-x^\ast\|_2<\varepsilon
\]
この式では、\(\varepsilon\) は状態が基準点から離れてよい最大距離を表し、\(\delta\) は初期状態について許容するずれを表す。初期状態を十分近くに設定すれば、その後のすべての時点で状態が基準点の近くに留まるという意味である。
この条件は、ある一つの軌道が最終的に許容範囲へ入るという条件とは異なる。リアプノフ安定性では、基準状態の近傍から出発する軌道全体について、ずれがどのように伝播するかを調べる必要がある。
さらに、リアプノフ安定性が成立することと、状態が固定点へ収束することも異なる。例えば、固定点の近くに留まり続けるものの、その周囲を周期的に動く軌道が存在する場合がある。この場合、基準点から大きく離れないという性質は成立していても、固定点へ近づき続けるとは限らない。
固定点の近くから出発した状態が、近傍に留まるだけでなく、その固定点へ収束する性質を考える場合には、漸近安定性という概念が用いられる。漸近安定性は、リアプノフ安定性に加えて、対象となる初期状態からの軌道が固定点へ近づくことを要求する。
構造振動モデルでは、環境条件や観測結果、介入によって更新規則の入力が変化するため、単純な自律系 \(x_{t+1}=F(x_t)\) として表せるとは限らない。リアプノフ安定性を適用する場合には、構造だけでなく環境を含めた状態を定義するか、環境条件や介入の扱いを固定したうえで、どの固定点や軌道について安定性を調べるかを明示する必要がある。
そのため、構造振幅が小さくなっているという観測事実だけから、リアプノフ安定性を主張することはできない。初期状態や環境条件をわずかに変更した場合に、その後の構造がどう推移するかを確認する必要がある。
9.9. 再励起は振幅の増加として記録できる
構造の更新が小さくなった後、新しい外部条件によって再び大きな更新が発生することがある。例えば、運用が落ち着いて構造変更が少なくなったソフトウェアに、新しい法令への対応や外部サービスの仕様変更が必要になる場合である。
このような状況では、既存の処理経路を再構成したり、新しい記録経路を追加したりする必要が生じることがある。更新前後の構造を比較すれば、振幅が再び大きくなったことを記録できる。
例えば、ある期間の構造振幅が次のように推移していたとする。
\[
A_1=3,\quad A_2=2,\quad A_3=1,\quad A_4=0
\]
この系列では、構造更新の規模が次第に小さくなり、時刻 4 では採用した表現上の構造差が検出されていない。次に、新しい要求によって大規模な構造変更が発生し、時刻 5 の振幅が次のようになったとする。
\[
A_5=4
\]
この場合、振幅が小さくなった後に再び増加したことが確認できる。構造振動モデルでは、このような更新量の再増大を再励起と呼ぶことができる。
ただし、再励起という名称は、観測された構造振幅の推移を説明するものであり、振幅の増加原因を自動的に特定するものではない。新しい要求が到来したために更新された場合もあれば、既存の障害が遅れて発見された場合や、以前の変更を切り戻した場合もある。さらに、観測対象とするグラフの粒度や埋め込み写像を変更すると、実際の構造更新とは別の理由で振幅が増加して見える可能性もある。
再励起の原因を分析するには、構造振幅だけでなく、その時点の環境条件、観測結果、介入を対応づける必要がある。例えば、新しい外部仕様が公開された時刻、変更対象となった依存関係、実際に行われた介入、変更後の観測結果を記録すれば、構造更新と外部条件の時間的な関係を確認できる。
ただし、時間的に近接していることだけで因果関係が確定するわけではない。同じ時点に別の要求や障害が発生していた可能性もある。更新写像の規則や判断記録を確認し、どの条件に基づいて介入が選択されたかを調べる必要がある。
また、再励起の後に構造振幅が再び減少したとしても、それだけで以前の構造へ戻ったとは限らない。以前とは異なる構造へ収束する場合もあれば、小さな更新を繰り返しながら別の方向へ移動する場合もある。振幅の推移だけでなく、各時点の構造そのものを比較することで、再励起後の状態を評価できる。
9.10. 構造の安定性は測定対象と条件によって定まる
構造振動モデルにおける安定性を評価するには、構造がどのような状態へ向かっているかを測定し、その状態が運用上の目的を満たしているかを確認する必要がある。構造振幅が小さくなっていることは、隣接時点間の変更規模が減少していることを示す。一方、状態の収束は、構造の表現が特定の状態へ近づいていることを示す。有界性は、構造が一定の範囲を超えないことを表す。
これらの性質は、互いに関連していても同一ではない。例えば、連続値の重みを持つ構造では、振幅がゼロへ近づいても状態が発散する場合がある。固定された有限の二値グラフでは、構造間距離に正の最小値が存在するため、振幅がゼロへ近づけば、ある時点以降は構造が変化しなくなる。また、振幅の総和が有限であり、埋め込み先が完備であれば、埋め込みベクトルの収束を導くことができる。
どの結論が成立するかは、構造空間の定義、埋め込み写像、距離、更新規則によって決まる。構造振動モデルにおいて数学的な安定性を扱う場合、これらの条件を明示する必要がある。
さらに、運用上の安定性を評価する場合には、構造間距離とは別に、重要な機能の継続、障害の影響範囲、復旧時間、記録の正確性などを確認する必要がある。構造が収束していても、収束先が必要な機能を提供できなければ、運用上望ましい状態とはいえない。反対に、構造が継続して更新されていても、要求された機能と安全条件を維持できる場合がある。
構造振動モデルが安定性を分析するために与える基盤は、構造の状態、構造間距離、環境、観測、介入を区別して記録できることである。この区別によって、構造振幅が減衰したという事実と、状態が収束したという数学的な結論、運用上の要求を満たしたという評価を分けて扱える。
10. ソフトウェアの構造更新を一つの数値例で追跡する
構造振動モデルでは、各時点の構造をグラフとして記録し、構造間距離によって更新の大きさを測定する。さらに、複雑さの尺度を別に定義すれば、構造の更新方向も数値として表せる。これらの定義が実際にどのような情報を与えるのかを確認するため、四つの部品からなる仮想的なソフトウェアを用いて、初期状態から複数回の更新までを計算する。
この例では、機能不足への備えとして処理経路を追加し、運用上の問題が報告された後に一部の経路を削除し、新しい要求を受けて再び経路を追加する。この過程を、構造の埋め込み、構造振幅、複雑さの増減という三つの観点から追跡する。なお、ここで扱う構造と更新の経過は計算方法を示すために設定したものであり、特定のソフトウェアについて実際に観測された結果ではない。
10.1. 四つの部品と六つの候補エッジを定義する
最初に、四つの部品 A、B、C、D からなるソフトウェアを考える。A は要求の受付、B は入力検証、C は処理、D は結果の記録を担当する。それぞれの部品をグラフのノードとして扱う。
ノードの集合を \(V\) とすると、次のようになる。
\[
V=\{A,B,C,D\}
\]
この例では、すべての時点で四つの部品が維持されるものとする。したがって、時刻 \(t\) におけるノード集合 \(V_t\) は、どの時点でも同じである。
\[
V_t=V
\]
構造の更新対象となるのは、部品間の呼び出し関係である。関係には向きがあり、A から B への関係と B から A への関係は区別する。また、どの時点でも同じ規則で構造を比較するため、候補となるエッジを六本に固定する。
ここでは、第6・8章で用いた四つの部品とは同じ対象を扱うが、構造更新の履歴は独立した仮想例とする。候補エッジの番号とその並び順も、次のように改めて定義する。
\[
\begin{aligned}
e_1&=(A,B)\\
e_2&=(B,C)\\
e_3&=(C,D)\\
e_4&=(A,D)\\
e_5&=(B,D)\\
e_6&=(A,C)
\end{aligned}
\]
\(e_1\) は受付 A から入力検証 B への関係、\(e_2\) は入力検証 B から処理 C への関係、\(e_3\) は処理 C から記録 D への関係である。この三本によって、受付、入力検証、処理、記録という通常の処理経路が形成される。
\(e_4\) は受付 A から記録 D への直接経路、\(e_5\) は入力検証 B から記録 D への直接経路、\(e_6\) は受付 A から処理 C への直接経路を表す。これらの経路は、通常の処理経路とは別の条件で利用されるものとして考える。
例えば、\(e_5\) は入力検証に失敗した要求を記録する経路として利用できる。一方、\(e_4\) は受付段階での例外情報を記録する経路として利用することが考えられる。ただし、どの条件で各経路を呼び出すかは、グラフの接続関係だけでは決まらない。実際のソフトウェアでは、経路の選択条件や処理内容を別に定義する必要がある。
同様に、\(e_6\) を追加した場合、A から C へ直接進む経路が存在することになる。この経路を安全に利用できるかどうかは、B が担っている入力検証をどのように実施するかによって決まる。グラフ上でエッジを追加できることと、その経路がソフトウェアの要求や安全条件を満たすことは別の問題である。
ここでは、構造の比較方法を明確にするため、各候補エッジの存在だけを測定する。エッジが存在する場合は 1、存在しない場合は 0 を割り当てる。通信時間、呼び出し頻度、障害発生率などは、構造の重みには含めない。
この規則によって、各時点の構造を六次元の二値ベクトルとして表現できる。埋め込み写像 \(\phi\) は、候補エッジの有無を \(e_1,e_2,e_3,e_4,e_5,e_6\) の順に並べるものとする。
\[
x_t=\phi(S_t)=(b_{1,t},b_{2,t},b_{3,t},b_{4,t},b_{5,t},b_{6,t})
\]
\(b_{i,t}\) は、時刻 \(t\) においてエッジ \(e_i\) が存在する場合に 1、存在しない場合に 0 を取る変数である。
\[
b_{i,t}=
\begin{cases}
1 & \text{エッジ }e_i\text{ が存在する場合}\\
0 & \text{エッジ }e_i\text{ が存在しない場合}
\end{cases}
\]
この埋め込みでは、ベクトルの各成分が特定のエッジに一対一で対応する。六つの候補エッジだけで構造を完全に表現するという条件の下では、異なる関係集合は異なるベクトルになる。
複雑さの尺度には、存在するエッジの本数を採用する。
\[
K(S_t)=|E_t|
\]
\(E_t\) は時刻 \(t\) に存在するエッジの集合である。この尺度は関係数の増減を測定するものであり、実際の保守費用や障害リスクを直接表すものではない。
さらに、構造間距離には埋め込み後のユークリッド距離を使用する。
\[
d(S_a,S_b)=\|\phi(S_a)-\phi(S_b)\|_2
\]
これらの定義を固定したうえで、構造の更新を時刻 0 から時刻 4 まで追跡する。
10.2. 初期状態から四回の構造更新を記録する
時刻 \(t=0\) では、通常の処理経路だけが存在するとする。受付 A から入力検証 B、入力検証 B から処理 C、処理 C から記録 D へ要求が渡される。
初期状態の関係集合は次のようになる。
\[
E_0=\{e_1,e_2,e_3\}
\]
六つの候補エッジのうち、最初の三本だけが存在するため、埋め込みベクトルは次のようになる。
\[
x_0=(1,1,1,0,0,0)
\]
この時点で存在するエッジは三本である。
\[
K(S_0)=3
\]
これを比較の基準となる初期構造とする。時刻 0 には直前の構造を設定していないため、構造振幅と複雑さの差分は定義しない。
次に、時刻 \(t=1\) では、将来発生する可能性のある例外への備えとして、二本の経路を追加する。
一つ目は、受付 A から記録 D への経路 \(e_4\) である。二つ目は、入力検証 B から記録 D への経路 \(e_5\) である。通常の処理経路は維持したまま、例外に対応するための経路を増やす。
更新後の関係集合は次のようになる。
\[
E_1=\{e_1,e_2,e_3,e_4,e_5\}
\]
埋め込みベクトルでは、四番目と五番目の成分が 0 から 1 へ変化する。
\[
x_1=(1,1,1,1,1,0)
\]
存在するエッジは五本となる。
\[
K(S_1)=5
\]
この更新は、未知の例外への備えを優先して関係を増やす判断の例である。ただし、二本の経路が必要だったかどうかは、経路を追加したという事実だけでは判断できない。実際に想定される例外を処理できるか、追加した経路が別の障害を発生させないかなどを確認する必要がある。
時刻 \(t=2\) では、運用中に例外経路に関係する競合が報告されたとする。その報告を受け、入力検証 B から記録 D への経路 \(e_5\) を削除する。
通常の処理経路と、受付 A から記録 D への経路 \(e_4\) は維持する。更新後の関係集合は次のようになる。
\[
E_2=\{e_1,e_2,e_3,e_4\}
\]
五番目の成分が 1 から 0 へ変化するため、埋め込みベクトルは次のようになる。
\[
x_2=(1,1,1,1,0,0)
\]
エッジ数は五本から四本へ減少する。
\[
K(S_2)=4
\]
この操作は、観測された競合報告を判断材料として関係を削除する例である。ただし、競合の原因が実際に \(e_5\) にあったと確定したわけではない。削除という介入が行われた事実と、その介入が問題を解消したかどうかという評価は区別する必要がある。
続いて、時刻 \(t=3\) では、受付 A から記録 D への経路 \(e_4\) も削除するとする。これにより、構造は最初の通常処理経路だけを持つ状態へ戻る。
\[
E_3=\{e_1,e_2,e_3\}
\]
埋め込みベクトルは次のようになる。
\[
x_3=(1,1,1,0,0,0)
\]
存在するエッジは三本である。
\[
K(S_3)=3
\]
この時点の構造は、初期状態 \(S_0\) と同じ関係集合を持つ。ただし、ここで一致しているのは、四つの部品と六つの候補エッジについて定義した構造である。実際のソフトウェアでは、内部処理、設定、運用条件などが変更されている可能性もあるため、対象として定義していない部分まで同一であるとは限らない。
最後に、時刻 \(t=4\) では、新しい要求に対応するため、受付 A から処理 C への経路 \(e_6\) を追加するとする。
この経路は、通常の入力検証経路とは異なる条件で使用されるものとし、入力の妥当性が別の方法で保証されるという設計上の前提を置く。エッジの追加だけで入力検証を省略してよいことが保証されるわけではない。
更新後の関係集合は次のようになる。
\[
E_4=\{e_1,e_2,e_3,e_6\}
\]
埋め込みベクトルでは、六番目の成分が 0 から 1 へ変化する。
\[
x_4=(1,1,1,0,0,1)
\]
エッジ数は四本となる。
\[
K(S_4)=4
\]
これで、時刻 0 から時刻 4 までに、二本の追加、一本の削除、一本の削除、一本の追加という四回の構造更新が記録された。
10.3. 構造振幅と複雑さの差分を計算する
各時点の構造を数値化できたので、構造振幅を計算する。構造振幅は、隣接する二つの時点の構造間距離である。
\[
A_t=d(S_t,S_{t-1})
\]
埋め込み後のユークリッド距離を採用しているため、次の式で計算する。
\[
A_t=\|x_t-x_{t-1}\|_2
\]
更新方向については、エッジ数を複雑さの尺度として採用しているため、次の差分を計算する。
\[
\Delta K_t=K(S_t)-K(S_{t-1})
\]
最初に、時刻 0 から時刻 1 への更新を考える。
\[
\begin{aligned}
x_0&=(1,1,1,0,0,0)\\
x_1&=(1,1,1,1,1,0)
\end{aligned}
\]
二つのベクトルの差は、次のようになる。
\[
x_1-x_0=(0,0,0,1,1,0)
\]
四番目と五番目の成分だけが変化している。したがって、ユークリッド距離は次のように計算できる。
\[
\begin{aligned}
A_1&=\sqrt{0^2+0^2+0^2+1^2+1^2+0^2}\\
&=\sqrt{2}\\
&\approx1.414
\end{aligned}
\]
エッジ数は三本から五本へ増加している。
\[
\Delta K_1=5-3=2
\]
この更新では、構造振幅が \(\sqrt{2}\)、エッジ数の増加が二本である。二本のエッジを追加したことが、そのまま二つの成分の変化として記録されている。
次に、時刻 1 から時刻 2 への更新を考える。
\[
\begin{aligned}
x_1&=(1,1,1,1,1,0)\\
x_2&=(1,1,1,1,0,0)
\end{aligned}
\]
ベクトルの差は次のようになる。
\[
x_2-x_1=(0,0,0,0,-1,0)
\]
五番目の成分だけが 1 から 0 へ変化している。構造振幅は次のようになる。
\[
A_2=\sqrt{(-1)^2}=1
\]
エッジ数は五本から四本へ減少しているため、差分は負になる。
\[
\Delta K_2=4-5=-1
\]
この更新では、構造振幅が 1 であり、エッジ数が一本減少している。
時刻 2 から時刻 3 への更新でも、一本のエッジが削除される。
\[
\begin{aligned}
x_2&=(1,1,1,1,0,0)\\
x_3&=(1,1,1,0,0,0)
\end{aligned}
\]
ベクトルの差は次のようになる。
\[
x_3-x_2=(0,0,0,-1,0,0)
\]
したがって、構造振幅は次のようになる。
\[
A_3=1
\]
エッジ数の差分は次のようになる。
\[
\Delta K_3=3-4=-1
\]
時刻 1 から 2 への更新と、時刻 2 から 3 への更新は、どちらも構造振幅が 1、差分が -1 である。ただし、前者では \(e_5\) が削除され、後者では \(e_4\) が削除されている。構造振幅とエッジ数の差分が一致していても、変更されたエッジの識別情報がなければ、どの関係が変更されたかまでは分からない。
最後に、時刻 3 から時刻 4 への更新を考える。
\[
\begin{aligned}
x_3&=(1,1,1,0,0,0)\\
x_4&=(1,1,1,0,0,1)
\end{aligned}
\]
ベクトルの差は次のようになる。
\[
x_4-x_3=(0,0,0,0,0,1)
\]
構造振幅は次のようになる。
\[
A_4=1
\]
一方、エッジ数の差分は正になる。
\[
\Delta K_4=4-3=1
\]
時刻 2 と時刻 3 では、それぞれ一本のエッジが削除されていた。時刻 4 では、一本のエッジが追加されている。構造振幅はどの更新でも 1 であるが、時刻 4 では複雑さの差分の符号が反転している。
各時点の計算結果を一つの表に整理すると、次のようになる。
| 時点 | 埋め込み \(x_t\) | エッジ数 \(K(S_t)\) | 構造振幅 \(A_t\) | 増減 \(\Delta K_t\) |
|---|---|---|---|---|
| \(t=0\) | \((1,1,1,0,0,0)\) | 3 | 基準時点のため未定義。 | 基準時点のため未定義。 |
| \(t=1\) | \((1,1,1,1,1,0)\) | 5 | \(\sqrt{2}\) | \(+2\) |
| \(t=2\) | \((1,1,1,1,0,0)\) | 4 | \(1\) | \(-1\) |
| \(t=3\) | \((1,1,1,0,0,0)\) | 3 | \(1\) | \(-1\) |
| \(t=4\) | \((1,1,1,0,0,1)\) | 4 | \(1\) | \(+1\) |
表から、構造振幅とエッジ数の増減が異なる情報を表していることを確認できる。時刻 1 では二本の追加によって振幅が \(\sqrt{2}\) となる。時刻 2 と時刻 3 では一本ずつ削除され、振幅はそれぞれ 1 となる。時刻 4 では一本を追加するため振幅は同じ 1 であるが、エッジ数の差分は正になる。
構造振幅だけを比較すると、時刻 2、3、4 はすべて同じ値を持つ。しかし、エッジ数の差分を併せて確認すれば、時刻 2 と 3 は減少方向、時刻 4 は増加方向の更新であることが分かる。
10.4. 追加本数と削除本数から計算結果を検証する
今回の例では、各エッジを二値で表現しているため、構造振幅とエッジ数の差分について、追加本数と削除本数を使った関係式が成立する。
時刻 \(t-1\) から時刻 \(t\) までに追加されたエッジの本数を \(a_t\)、削除されたエッジの本数を \(r_t\) とする。
\[
a_t=|E_t\setminus E_{t-1}|
\]
\[
r_t=|E_{t-1}\setminus E_t|
\]
ここで \(\setminus\) は集合の差を表す。第一の式では、更新後に存在し、更新前には存在しなかったエッジを数える。第二の式では、更新前に存在し、更新後には存在しなくなったエッジを数える。
二値ベクトルのユークリッド距離を使用しているため、構造振幅の二乗は、追加本数と削除本数の合計になる。
\[
A_t^2=a_t+r_t
\]
一方、エッジ数の差分は、追加本数から削除本数を引いた値になる。
\[
\Delta K_t=a_t-r_t
\]
この二つの式を、今回の四回の更新に適用する。
時刻 1 では、二本のエッジが追加され、削除されたエッジは存在しない。
\[
a_1=2,\qquad r_1=0
\]
したがって、次のようになる。
\[
A_1^2=2+0=2
\]
\[
\Delta K_1=2-0=2
\]
時刻 2 では、一本のエッジが削除され、追加されたエッジは存在しない。
\[
a_2=0,\qquad r_2=1
\]
この場合、次のようになる。
\[
A_2^2=0+1=1
\]
\[
\Delta K_2=0-1=-1
\]
時刻 3 も同じく一本の削除であるため、次の結果になる。
\[
A_3^2=1,\qquad \Delta K_3=-1
\]
時刻 4 では一本の追加が行われる。
\[
a_4=1,\qquad r_4=0
\]
したがって、次のようになる。
\[
A_4^2=1,\qquad \Delta K_4=1
\]
この計算は、埋め込みベクトルから直接求めた構造振幅と、エッジ数から求めた差分に一致している。追加本数と削除本数を別に数えることで、数値計算の整合性を確認できる。
さらに、構造振幅とエッジ数の差分から、追加本数と削除本数を逆算することもできる。
\[
a_t=\frac{A_t^2+\Delta K_t}{2}
\]
\[
r_t=\frac{A_t^2-\Delta K_t}{2}
\]
例えば、時刻 1 の結果 \(A_1^2=2\)、\(\Delta K_1=2\) を代入すると、次のようになる。
\[
a_1=\frac{2+2}{2}=2
\]
\[
r_1=\frac{2-2}{2}=0
\]
二本の追加と削除なしという実際の更新内容が復元される。
時刻 4 では、\(A_4^2=1\)、\(\Delta K_4=1\) である。
\[
a_4=\frac{1+1}{2}=1
\]
\[
r_4=\frac{1-1}{2}=0
\]
この場合も、一本の追加と削除なしという更新内容に一致する。
ただし、これらの式から分かるのは、追加されたエッジと削除されたエッジの本数である。どのエッジが変更されたかまでは復元できない。例えば、時刻 2 と時刻 3 では、どちらも追加本数が 0、削除本数が 1 である。しかし、削除されたエッジは異なる。
変更対象まで特定するには、構造振幅と差分に加えて、各時点の関係集合または埋め込みベクトルそのものを記録する必要がある。この違いは、集約した数値指標と、構造を記述する完全な情報の差として理解できる。
10.5. 初期構造へ戻っても途中の更新履歴は消えない
今回の例には、構造間距離を解釈するうえで重要な性質がある。時刻 0 と時刻 3 では、関係集合が完全に一致している。
\[
E_0=E_3=\{e_1,e_2,e_3\}
\]
したがって、埋め込みベクトルも一致する。
\[
x_0=x_3=(1,1,1,0,0,0)
\]
二つの構造間距離を計算すると、次のようになる。
\[
d(S_0,S_3)=\|x_3-x_0\|_2=0
\]
この結果は、時刻 0 と時刻 3 の構造が、採用した六つのエッジ候補について同一であることを示している。
しかし、時刻 0 から時刻 3 までの間に、構造更新が発生しなかったわけではない。時刻 1 では二本の経路を追加し、時刻 2 と時刻 3 ではそれぞれ一本ずつ削除している。
各更新で測定された構造振幅を合計すると、次のようになる。
\[
\begin{aligned}
A_1+A_2+A_3
&=\sqrt{2}+1+1\\
&=\sqrt{2}+2\\
&\approx3.414
\end{aligned}
\]
初期構造と時刻 3 の構造の直接距離はゼロである一方、途中の構造振幅の合計は約 3.414 となる。この違いは、二つの時点の直接距離と、途中の状態遷移に沿って測定した距離の合計が、異なる量だからである。
初期状態から最終状態までの直接距離は、途中でどのような経路を通ったかを表さない。今回の例では、二本の経路を追加した後、同じ二本を削除することで初期状態へ戻っている。開始時点と終了時点だけを比較すると、途中で発生した追加と削除は距離に反映されない。
一般に、距離が三角不等式を満たす場合、二つの時点の直接距離は、途中の各時点間の距離を合計した値以下となる。
\[
d(S_0,S_3)\le A_1+A_2+A_3
\]
今回の計算結果を代入すると、次のようになる。
\[
0\le\sqrt{2}+2
\]
この不等式は成立する。ただし、三角不等式は一般に等号を要求しない。途中で追加した関係を後から削除して元の構造へ戻る場合には、直接距離よりも途中の更新量の合計が大きくなる。
更新履歴を比較するもう一つの方法として、追加されたエッジと削除されたエッジの総本数を数えることもできる。
時刻 0 から時刻 3 までに追加されたエッジは二本、削除されたエッジも二本である。
\[
\sum_{t=1}^{3}a_t=2
\]
\[
\sum_{t=1}^{3}r_t=2
\]
追加と削除を合わせた変更本数は四本となる。
\[
\sum_{t=1}^{3}(a_t+r_t)=4
\]
一方、エッジ数の純増減はゼロである。
\[
\sum_{t=1}^{3}\Delta K_t=2-1-1=0
\]
この関係から、変更の総量と純増減の違いを確認できる。途中で四本分の追加・削除操作が行われていても、最終的なエッジ数は初期状態と同じになる。
さらに、構造振幅の合計と、追加・削除の総本数も同じ値ではない。
\[
\sum_{t=1}^{3}A_t=\sqrt{2}+2
\]
\[
\sum_{t=1}^{3}A_t^2=2+1+1=4
\]
前者は各更新のユークリッド距離を合計した値であり、後者は各更新で変更されたエッジの本数を合計した値である。今回採用した二値表現では、構造振幅の二乗が変更本数に一致するため、この違いが生じる。
構造の更新履歴を評価する際には、どちらの量を用いるかを明確にする必要がある。変更されたエッジの総本数を測定したいなら、各時点の \(A_t^2\) を合計する方法が使える。一方、構造空間上で各更新の距離を合計したいなら、\(A_t\) をそのまま合計することになる。
ただし、いずれの量も、実際の変更作業に必要な時間や費用を直接表しているわけではない。一本のエッジを変更する作業であっても、重要な処理経路の変更には大規模な動作確認が必要になる場合がある。構造上の変更本数と実務上の変更費用は別の量として扱う必要がある。
10.6. 同じ振幅から異なる更新方向が生じる
今回の計算で、構造振幅と更新方向の違いが最も明確に表れるのは、時刻 2、3、4 の比較である。
それぞれの構造振幅は、次のように等しい。
\[
A_2=A_3=A_4=1
\]
しかし、エッジ数の差分は異なる。
\[
\Delta K_2=-1,\qquad
\Delta K_3=-1,\qquad
\Delta K_4=1
\]
時刻 2 と時刻 3 ではエッジが削除され、時刻 4 では追加されている。構造振幅が同じであっても、構造を更新した方向は異なる。
時刻 3 と時刻 4 の間では、隣接する二回の更新について、複雑さの差分の符号が反転している。
\[
\Delta K_4\Delta K_3
=1\times(-1)
=-1<0
\]
この不等式は、エッジ数という尺度で、減少方向から増加方向へ切り替わったことを示している。構造振動モデルで複雑化と単純化の交代を分析する場合、このような符号の比較を利用できる。
一方、時刻 2 と時刻 3 では、どちらも差分が -1 である。
\[
\Delta K_3\Delta K_2
=(-1)\times(-1)
=1
\]
積が正であるため、この二回の更新では増減方向は反転していない。構造が二回続けて単純化されたと記述できるのは、ここで採用したエッジ数という尺度に関してである。
ただし、この更新系列から周期的な構造振動が成立しているとは結論できない。時刻 1 では二本が追加され、時刻 2 と 3 では一本ずつ削除され、時刻 4 では別の一本が追加されている。更新方向が反転していても、同じ状態の系列が一定の間隔で繰り返されているわけではない。
時刻 0 と時刻 3 では同じ構造が現れるが、それだけで周期性が保証されるわけでもない。周期性を主張するには、構造が一定の時点間隔で繰り返されるという追加の条件が必要となる。
また、構造振幅の推移にも注意が必要である。今回の例では、最初の更新で振幅が \(\sqrt{2}\) となり、その後は 1 が続いている。
\[
A_1=\sqrt{2},\qquad
A_2=A_3=A_4=1
\]
最初の更新より後の更新量が小さいことは確認できる。しかし、この有限個の観測結果だけから、将来にわたって振幅が減衰することや、構造が安定することを結論できない。時刻 4 の後に再び複数の経路が追加されれば、構造振幅が増加する可能性もある。
10.7. 構造の変化と運用結果を対応づける
ここまでの数値計算によって、各時点でどの関係が追加または削除され、その更新によって構造振幅とエッジ数がどのように変化したかを確認できた。しかし、構造振幅やエッジ数の増減だけでは、更新が運用上妥当だったかどうかは判断できない。
例えば、時刻 1 で二本の例外経路を追加した後、競合に関する報告が増加したとする。この場合、例外経路の追加と競合報告の増加が時間的に対応している。しかし、同じ期間に利用件数が増加したり、入力データの種類が変化したりしていれば、報告件数の増加には別の要因が関係している可能性がある。
この違いを扱うため、構造振動モデルでは、構造 \(S_t\)、環境 \(C_t\)、観測 \(O_t\)、介入 \(U_t\) を区別する。
\[
O_t=G(S_t,C_t)
\]
\[
S_{t+1}=M(S_t,C_t,O_t,U_t)
\]
\[
C_{t+1}=H(C_t,O_t)
\]
第一の式は、構造と環境から観測結果を定める。第二の式は、構造、環境、観測、介入から次の構造を定める。第三の式は、環境と観測から次の環境条件を定める。
今回の例では、時刻 1 の介入は \(e_4\) と \(e_5\) の追加である。時刻 2 の介入は \(e_5\) の削除、時刻 3 の介入は \(e_4\) の削除、時刻 4 の介入は \(e_6\) の追加である。
それぞれの介入を \(U_0,U_1,U_2,U_3\) と表すと、構造の更新は次のように記述できる。
\[
\begin{aligned}
S_1&=M(S_0,C_0,O_0,U_0)\\
S_2&=M(S_1,C_1,O_1,U_1)\\
S_3&=M(S_2,C_2,O_2,U_2)\\
S_4&=M(S_3,C_3,O_3,U_3)
\end{aligned}
\]
この式では、各時刻の介入 \(U_t\) が、時刻 \(t\) から時刻 \(t+1\) への更新に作用している。例えば \(U_1\) は、時刻 1 の構造 \(S_1\) から時刻 2 の構造 \(S_2\) へ移る際に、\(e_5\) を削除する介入である。
介入の内容だけを記録すれば、どのエッジが変更されたかは確認できる。しかし、その介入が選択された理由や、変更後の運用結果まで説明するには、環境と観測の記録が必要になる。
例えば、時刻 2 で \(e_5\) を削除する判断を評価する場合には、少なくとも次の情報が考えられる。削除前の利用件数、競合が発生した要求の種類、競合が発生した時刻、削除後の障害件数、削除によって失われた機能の有無である。
競合報告の件数を \(F_t\)、処理された要求数を \(N_t\) とする。単純な件数比較では、利用件数が異なる時点の障害の発生状況を適切に比較できない場合がある。そのため、要求数に対する競合報告の割合を計算する方法が考えられる。
\[
R_t=\frac{F_t}{N_t}
\]
\(R_t\) は、処理された要求数に対する競合報告件数の割合である。ただし、この式を利用するには \(N_t>0\) が必要であり、競合報告の数え方と要求の単位も時点間で統一する必要がある。
仮に、削除前の評価期間に 1000 件の要求が処理され、そのうち 20 件について競合が報告されたとする。この場合、競合報告の割合は次のようになる。
\[
R_{\mathrm{before}}=\frac{20}{1000}=0.02
\]
削除後の評価期間に 2000 件の要求が処理され、そのうち 10 件について競合が報告された場合には、次のようになる。
\[
R_{\mathrm{after}}=\frac{10}{2000}=0.005
\]
この仮想的な観測結果では、競合報告の割合が 2% から 0.5% へ減少している。要求数が異なる二つの期間でも、同じ定義の割合を用いて比較できる。
ただし、競合報告の割合が減少したことだけで、\(e_5\) の削除が原因だったとは結論できない。入力データの種類や外部サービスの状態が同時に変化していた場合、割合の減少にはそれらの条件が影響している可能性がある。また、削除によって競合を検出または記録する経路が失われていれば、実際の競合が減少していなくても報告件数だけが減る場合がある。
したがって、構造更新の効果を評価するには、観測する指標が更新前後で同じ意味を持っているか、環境条件がどの程度一致しているか、削除した経路が他の機能へ影響していないかを確認する必要がある。
同じ問題は、時刻 4 の新しい経路 \(e_6\) の追加についても生じる。エッジを一本追加したことで構造振幅が 1 になったことは計算できる。しかし、その追加によって処理時間が短縮されたか、入力検証の安全性が維持されたか、例外処理の負担が減ったかは、別の観測によって評価する必要がある。
10.8. 構造更新の記録から確定できること
今回の数値例では、ノード集合、候補エッジ、埋め込み写像、距離、複雑さの尺度をすべて固定した。そのため、各時点の構造を再現可能な形で記録でき、構造振幅と増減方向を計算できた。
初期状態 \(S_0\) には三本のエッジが存在し、時刻 1 では二本を追加して五本となった。時刻 2 と時刻 3 では一本ずつ削除し、時刻 3 には初期状態と同じ関係集合へ戻った。時刻 4 では別の一本を追加し、四本のエッジを持つ構造となった。
この更新系列から、時刻 0 と時刻 3 の構造間距離はゼロでありながら、その途中では複数回の更新が行われていたことを確認できた。また、構造振幅が同じ 1 であっても、エッジを削除した場合と追加した場合が存在した。さらに、時刻 3 と時刻 4 の間では、エッジ数の減少方向から増加方向への反転を検出できた。
これらは、構造の定義と更新記録から直接計算できる結果である。一方、経路を追加した判断が適切だったか、削除によって競合が解消したか、新しい経路が運用を安定させたかという問いには、構造間距離だけでは答えられない。
今回のモデルで数値として確定できるのは、採用した六つの候補エッジについて、どの時点でどの関係が存在し、どの関係が追加または削除されたかという構造の履歴である。障害の原因や介入の効果を説明する場合には、その履歴と環境条件、観測結果、更新規則を対応づける必要がある。
また、この数値例ではノード集合を固定し、すべての関係を二値で表している。部品の追加や削除、責任の分割と統合、通信特性の変化などを測定したい場合には、それらを保持できる構造表現を定義しなければならない。今回の距離は、六つの候補エッジについての接続差を正確に測定するが、その範囲外の構造差は測定しない。
この数値例では、初期構造と時刻 3 の構造が一致する一方、その間に二本の追加と二本の削除が行われている。また、同じ構造振幅の下で削除から追加への方向反転が生じている。この二つの結果は、構造の一時点の状態だけでも、構造振幅だけでも捉えられない。構造振動を分析するには、各時点の構造、隣接時点間の差、更新方向をそれぞれ記録する必要がある。
11. 観測可能性と介入効果がモデルの検証範囲を決める
構造振動モデルによって、ソフトウェアの構造をグラフとして記録し、各時点の構造振幅と更新方向を計算できる。しかし、構造が変化したことを確認できても、その変更によって運用上の問題が改善したかどうかは、別の検証を必要とする。例えば、例外処理経路を削除した後にエラー率が低下した場合、構造変更とエラー率の低下が時間的に対応していることは確認できる。一方、その低下が構造変更によって生じたのかを判断するには、他の条件を調べる必要がある。
同じ期間に利用者数が減少したり、入力データの種類が変化したりしていれば、エラー率の変化には環境条件が関係している可能性がある。また、監視規則が変更され、以前は検出されていたエラーの一部が記録されなくなっていれば、実際の障害が減少していなくても観測値は小さくなる。構造変更による改善と、環境や観測方法の変化による数値の差を区別しなければ、構造更新の効果を適切に評価できない。
構造振動モデルでは、こうした問題を分析するため、構造、環境、観測、介入を異なる変数として定義している。ただし、これらの変数を数式に含めたことだけで、構造の内部状態がすべて観測できるようになったり、介入の因果的な効果が自動的に特定されたりするわけではない。何を観測でき、どの条件で介入の効果を比較できるかを明示することが、モデルの検証範囲を定める。
11.1. 構造の状態と観測結果を区別する
構造振動モデルでは、時刻 \(t\) の構造を \(S_t\)、環境条件を \(C_t\)、観測結果を \(O_t\) とする。構造と環境から観測結果が定まる関係を、観測写像 \(G\) によって表す。
\[
O_t=G(S_t,C_t)
\]
\(S_t\) は構成要素、関係、重みからなる構造である。\(C_t\) は入力件数、入力の種類、外部サービスの状態など、構造が動作する環境条件を表す。\(O_t\) は、それらの条件の下で得られたエラー率、応答時間、記録件数などの測定結果である。
この式の役割は、構造と観測結果を数学的に区別することである。同じ構造であっても、環境条件が異なれば観測結果が異なる場合がある。また、異なる構造であっても、特定の環境条件では同じ観測結果が得られる場合がある。
例えば、受付 A、入力検証 B、処理 C、記録 D からなるソフトウェアを考える。構造 \(S_a\) では、A から B、B から C、C から D への通常経路だけが存在する。一方、構造 \(S_b\) では、この通常経路に加えて、入力検証 B から記録 D への例外経路が存在する。
二つの構造は、B から D への関係の有無によって区別される。
\[
S_a\neq S_b
\]
ここで、正常な入力だけを与える環境条件 \(C_{\mathrm{normal}}\) を考える。正常な入力は入力検証を通過し、通常の処理経路を進む。構造 \(S_b\) に追加された例外経路は使用されない。
この条件で、処理の成否、応答内容、通常の記録件数だけを観測するとすれば、二つの構造から同じ結果が得られる場合がある。
\[
G(S_a,C_{\mathrm{normal}})
=G(S_b,C_{\mathrm{normal}})
\]
この等式は、異なる構造が同じ環境条件の下で、同じ観測結果を生み得ることを表している。構造が異なるという事実と、観測結果が異なるという事実は、必ずしも一致しない。
一方、入力検証に失敗する要求を与える場合を考える。構造 \(S_a\) には拒否された要求を直接記録する経路がないが、構造 \(S_b\) にはその経路が存在する。例外経路が設計どおりに動作し、拒否された要求の記録件数を観測対象に含めれば、二つの構造の観測結果に差が現れる。
\[
G(S_a,C_{\mathrm{rejected}})
\neq G(S_b,C_{\mathrm{rejected}})
\]
\(C_{\mathrm{rejected}}\) は、入力検証に失敗する要求を含む環境条件を表す。二つの構造が同じ観測結果を生むかどうかは、与える入力と、何を結果として測定するかによって決まる。
正常な入力だけを使った動作確認では、二つの構造を区別できない場合がある。しかし、拒否された要求を含めて記録件数を観測すれば、違いを検出できる場合がある。これは、構造の違いが存在していても、それを観測できる条件が満たされなければ、出力から違いを識別できないことを示している。
11.2. 観測可能性は内部状態を識別できる条件に関係する
観測された出力から内部の状態を識別できるかという問題を、観測可能性という観点から考える。構造振動モデルでは、内部状態として有向重み付きグラフを扱っているため、観測可能性を考える際には、異なるグラフが同じ観測結果を生む場合を区別する必要がある。
例えば、二つの異なる構造 \(S_a\) と \(S_b\) について、同じ環境条件 \(C\) の下で次の関係が成立するとする。
\[
G(S_a,C)=G(S_b,C)
\]
この場合、環境条件 \(C\) における一回の観測結果だけから、構造が \(S_a\) なのか \(S_b\) なのかを判断することはできない。どちらの構造からも同じ観測結果が得られるためである。
一方、別の環境条件 \(C’\) を与えたときに、次の関係が成立するとする。
\[
G(S_a,C’)\neq G(S_b,C’)
\]
この場合、環境条件 \(C’\) における観測結果を追加すれば、二つの構造を区別できる可能性がある。先ほどの例では、正常な入力に加えて、入力検証に失敗する要求を与えることが、このような追加の観測条件に対応する。
ただし、二つの構造を区別できることと、考えられるすべての構造を識別できることは異なる。例えば、拒否された要求の記録件数を観測しても、記録経路の内部で使用される関数の構成まで特定できるとは限らない。また、二つの異なる経路が同じ記録結果を生む場合には、記録件数だけではその違いを区別できない。
したがって、観測可能性を検討する際には、最初に識別したい構造の範囲を定める必要がある。例えば、四つの部品間の呼び出し関係を識別したい場合と、各部品の内部関数まで識別したい場合では、必要な観測情報が異なる。
また、観測する指標によっても識別可能な範囲が異なる。例えば、処理時間だけを観測する場合、異なる構造が同じ処理時間を示す可能性がある。記録件数や処理経路の実行履歴まで観測する場合には、より多くの構造差を識別できる可能性がある。ただし、観測項目を増やすことが、必ずすべての構造を識別できることにつながるわけではない。
この違いを整理すると、次のようになる。
| 観測条件 | 確認できる情報 | 残る識別上の制約 |
|---|---|---|
| 正常な入力だけを与える。 | 通常の処理経路における応答や記録結果を確認できる。 | 使用されない例外経路の有無を、出力だけから識別できない場合がある。 |
| 入力検証に失敗する要求を与える。 | 例外処理や拒否された要求の記録結果を確認できる。 | 同じ結果を生む異なる内部処理を区別できるとは限らない。 |
| 処理経路の実行履歴を記録する。 | 実際に使用された呼び出し関係を確認できる。 | 観測期間中に使用されなかった関係の存在は確定できない場合がある。 |
| 構成情報から関係集合を直接取得する。 | 定義した粒度における呼び出し関係を記録できる。 | 記録していない内部構造や実行時の振る舞いまでは把握できない。 |
| 複数の入力条件と構造履歴を組み合わせる。 | 条件ごとの出力差と、記録された構造更新を対応づけられる。 | 観測した差の因果的な理由を確定するには追加の条件が必要になる。 |
ここでは、出力から構造を推定する方法と、構成情報から構造を直接取得する方法を区別している。例えば、ソフトウェアの設定や依存関係を記録する仕組みが存在すれば、特定の粒度における構造を直接確認できる場合がある。その場合でも、構造が実際にどのような結果を生んだかは、運用観測によって別に確認する必要がある。
また、時間とともに構造が更新される場合、同じ入力条件を繰り返しても、その間に構造が変更されていれば、観測結果の比較が難しくなる。構造の違いを識別するために複数の観測を用いる場合には、各観測時点の構造と環境条件を記録し、何を比較しているかを明確にする必要がある。
状態空間モデルの観測可能性は、観測写像だけでなく、状態遷移の規則にも依存する。例えば、現在は同じ出力を生む二つの状態でも、同じ入力条件の下で異なる状態遷移を行い、その後の出力に差が現れる場合がある。構造振動モデルでも、複数時点の観測によって構造を識別できるかどうかは、観測写像 \(G\) に加えて、更新写像 \(M\)、環境更新写像 \(H\)、介入 \(U_t\) の条件によって決まる。
したがって、一時点の観測結果が一致することだけを理由に、二つの構造が同一であると判断することはできない。観測可能性を検討するには、識別対象となる構造、与えられる環境条件、観測する指標、状態遷移の規則を対応づける必要がある。
11.3. 構造変更後のエラー率低下は介入効果を直接示さない
次に、構造更新の効果を評価する問題を考える。例えば、競合を引き起こす可能性のある例外処理経路を削除した後、エラー率が低下したとする。この場合、構造変更の前後で観測されたエラー率を比較することができる。
エラー件数を \(F_t\)、処理された要求数を \(N_t\) とし、\(N_t>0\) の場合のエラー率を次のように定義する。
\[
R_t=\frac{F_t}{N_t}
\]
\(R_t\) は、時刻 \(t\) の観測期間に処理された要求のうち、エラーとして記録された要求の割合である。例えば、1000 件の要求のうち 30 件でエラーが記録された場合、エラー率は 3% となる。
\[
R_t=\frac{30}{1000}=0.03
\]
ここで、構造変更の前には 1000 件中 30 件のエラーが発生し、変更後には 1000 件中 10 件となった場合を考える。この観測結果からは、エラー率が 3% から 1% へ低下したことを確認できる。
しかし、エラー率が低下したという事実だけでは、構造変更がその原因であったとは結論できない。例えば、変更前には処理の難しい要求が多く、変更後には処理の簡単な要求が多かった場合、構造が同じでもエラー率が低下する可能性がある。
この問題を具体的な数値例で確認する。要求を、通常の要求と、処理条件が複雑な要求の二種類に分ける。通常の要求ではエラー率が 1%、複雑な要求ではエラー率が 10% であるとする。
構造変更前には、通常の要求が 200 件、複雑な要求が 800 件処理されたとする。それぞれのエラー件数は、通常の要求が 2 件、複雑な要求が 80 件である。
一方、構造変更後には、通常の要求が 800 件、複雑な要求が 200 件処理されたとする。それぞれのエラー率は変更前と同じであり、通常の要求が 1%、複雑な要求が 10% である。
これらの仮想的な観測結果を表に整理すると、次のようになる。
| 観測期間 | 要求の種類 | 要求数 | エラー件数 | 種類別エラー率 |
|---|---|---|---|---|
| 構造変更前 | 通常の要求 | 200 | 2 | 1% |
| 構造変更前 | 複雑な要求 | 800 | 80 | 10% |
| 構造変更後 | 通常の要求 | 800 | 8 | 1% |
| 構造変更後 | 複雑な要求 | 200 | 20 | 10% |
変更前のエラー件数を合計すると、通常の要求で 2 件、複雑な要求で 80 件であるため、合計 82 件となる。要求数は 1000 件なので、全体のエラー率は次のようになる。
\[
R_{\mathrm{before}}=\frac{2+80}{200+800}
=\frac{82}{1000}
=0.082
\]
つまり、変更前の全体のエラー率は 8.2% である。
変更後について同じ計算をすると、エラー件数は通常の要求で 8 件、複雑な要求で 20 件となり、合計 28 件である。
\[
R_{\mathrm{after}}=\frac{8+20}{800+200}
=\frac{28}{1000}
=0.028
\]
変更後の全体のエラー率は 2.8% となる。全体の数値だけを比較すれば、エラー率が 8.2% から 2.8% へ大きく低下している。
しかし、通常の要求と複雑な要求を別々に見ると、どちらの種類でもエラー率は変化していない。通常の要求は変更前後とも 1%、複雑な要求は変更前後とも 10% である。
全体のエラー率が低下した理由は、エラー率の低い通常の要求の割合が増え、エラー率の高い複雑な要求の割合が減少したことにある。この例では、各種類の要求についてのエラー率が改善していなくても、入力の構成が変化するだけで全体のエラー率が改善して見える。
このような違いは、集計値だけから判断することの限界を示している。構造変更後に全体のエラー率が低下したとしても、処理された要求の種類や難易度の分布が変化していれば、その差を構造変更の効果として扱うことはできない。
なお、この数値例は、入力の構成が変わることで集計値が改善する場合を示すためのものである。実際の構造変更が、要求の種類ごとのエラー率に影響しなかったことを一般的に主張するものではない。実際の介入効果を評価する際には、入力の種類ごとの比較に加えて、他の条件の違いも確認する必要がある。
11.4. 同じ条件で介入した場合と介入しなかった場合を比較する
構造変更の効果を考える場合、本来比較したいのは、同じ条件の下で介入した場合と、介入しなかった場合の結果である。
例えば、ある例外経路を削除する介入を考える。介入を行った場合のエラー率と、同じ構造、同じ環境、同じ時点の条件で介入を行わなかった場合のエラー率を比較できれば、介入による差を評価するための基準になる。
しかし、実際の運用では、同じ対象について同じ時点に介入を行う場合と行わない場合の両方を観測することは通常できない。例外経路を削除したなら、その時点の対象システムでは削除しなかった場合の結果を直接観測できないからである。
このように、実際には観測されなかった別の選択を行った場合の結果を、反事実的な結果と呼ぶ。介入効果を評価するためには、実際に観測された結果と、介入しなかった場合に得られたであろう結果との差を考える必要がある。
Pearl の因果モデルは、観測された変数の関連と、ある変数へ介入した場合に生じる結果を区別する枠組みを与える[23]。Hernán と Robins の因果推論の体系も、比較対象、介入の定義、交絡要因、因果効果を識別するための仮定などを扱っている[24]。
構造振動モデルでは、介入を \(U_t\) として定義し、次の構造への更新に含めている。
\[
S_{t+1}=M(S_t,C_t,O_t,U_t)
\]
\(U_t\) は、構造に対して行われる操作を表す。例えば、例外経路を追加する、削除する、別の経路へ付け替えるといった操作が該当する。更新写像 \(M\) は、現在の構造、環境、観測、介入から次の構造を定める。
ただし、この式が与えるのは、どのような介入によって次の構造が形成されるかという状態遷移の記述である。介入がエラー率をどの程度低下させるかという因果効果は、この式だけでは求められない。
例えば、ある障害が発生したために例外経路を削除した場合、障害の発生状況そのものが介入を選択する理由となっている。障害の多い時点ほど経路の削除が行われやすいなら、介入の有無と障害の発生状況は最初から関連している。
このような条件の下では、介入が行われた期間と行われなかった期間を単純に比較しても、介入の効果と、介入が選択された理由による差を分離できない場合がある。介入が問題の発生に応じて選択されるという仕組みも、因果関係の評価では考慮する必要がある。
また、構造変更と同じ時点で、入力の種類、利用者数、外部サービス、監視方式などが変更された場合、それらの条件も結果へ影響する可能性がある。観測されたエラー率の差を介入の効果として解釈するには、介入以外の条件がどのように扱われているかを明示する必要がある。
ここで重要になるのは、構造変更の前後に差が存在することと、その差が構造変更によって生じたことを区別することである。前者は観測データから計算できる。後者は、比較対象の設定や因果関係についての仮定を必要とする。
11.5. 比較可能な条件を設定して介入効果を調べる
構造変更の効果を調べる方法として、可能な範囲で環境条件をそろえ、介入の有無による結果を比較する方法が考えられる。
例えば、特定の例外経路を削除することで、競合によるエラーが減少するという仮説を検証するとする。最初に、比較対象となる構造を定義する。次に、削除する経路を明示し、削除前後で何を観測するかを定める。
その際、同じ入力データ、同じ負荷、同じ外部サービスの状態を再現できる試験環境であれば、介入の有無による動作の違いを比較しやすくなる。例えば、同じ要求群を、例外経路を維持した構造と削除した構造の両方へ与え、発生したエラー件数を比較する方法がある。
ただし、同じ入力データを使っただけで、すべての条件が一致するとは限らない。実行時の資源使用状況、並行処理の順序、外部サービスの応答、偶然的な故障などが異なれば、結果に差が生じる可能性がある。必要に応じて、実行条件の固定、試行の反復、実行順序の調整などを行い、観測結果のばらつきを確認する必要がある。
構造変更を一部の対象に適用し、別の対象には適用しない比較も考えられる。例えば、対象の要求や実行環境を適切な条件で分け、一方にだけ構造変更を適用できる場合、同じ期間の結果を比較できる可能性がある。
ただし、二つの対象に初期状態の違いがある場合や、片方への介入がもう片方の動作へ影響する場合には、単純な比較が難しくなる。比較する対象が同等の条件にあることや、介入の影響がどこまで及ぶかを確認する必要がある。
実際のソフトウェアでは、安全性や運用上の制約によって、介入を自由に割り当てられない場合もある。例えば、重大な障害を防ぐ経路を意図的に無効化する実験は、本番運用では許容されない可能性がある。その場合には、試験環境での再現、過去の運用記録の比較、段階的な変更など、制約の範囲内で検証方法を選択する必要がある。
また、観測データから統計的に差が認められたとしても、比較条件に系統的な違いが残っていれば、その差を因果効果と解釈できるとは限らない。因果推論では、どの条件を調整し、どの要因が観測できていないかという問題が残る。介入の効果について主張できる範囲は、検証方法とその仮定に依存する。
構造振動モデルにおける介入変数 \(U_t\) は、何を変更したかを記録するための重要な情報である。しかし、介入の効果を定量化するには、介入の有無を比較できる条件と、結果の変化を測定する方法を追加する必要がある。
11.6. 入力表現と構造変更を分ける必要がある
構造と環境の違いは、ソフトウェアの依存関係だけでなく、判断を行うシステムの評価でも問題になる。例えば、同じ判定規則を使用していても、依頼文の言語や表現が異なることで、判定結果が変化する場合がある。
安全判定の変動を、入力表現、判断機構の構造、評価方法に分離する分析では、どの条件を変更した結果として出力差が生じたのかを区別している[25]。この区別は、構造振動モデルにおける構造 \(S_t\)、環境 \(C_t\)、観測結果 \(O_t\) の定義に対応する。
例えば、判断規則や内部の接続関係を固定し、依頼文の言語だけを変更するとする。この場合、構造は維持され、入力条件が変更されている。
\[
S_a=S_b,\qquad C_a\neq C_b
\]
この条件で判定結果が異なる場合、同じ構造が異なる入力条件へ応答した結果として記述できる。
\[
G(S_a,C_a)\neq G(S_a,C_b)
\]
この出力差を構造更新による振幅として数えることは、構造の定義と一致しない。構造が同一であるなら、構造間距離はゼロとなる。一方、観測結果には差が存在する。
次に、入力条件を比較可能な状態に保ち、判断規則や内部の関係構造を変更する場合を考える。この場合、構造が異なる状態として記録される。
\[
S_a\neq S_b,\qquad C_a=C_b
\]
この条件では、構造変更の前後で観測結果を比較できる。
\[
G(S_a,C_a)\quad\text{と}\quad G(S_b,C_a)
\]
ただし、構造と環境を数式上で区別しただけでは、内部のどの変更が観測結果の差を生んだかまで特定できない。例えば、複数の判断規則を同時に変更した場合、個々の規則の効果を分離するには、変更箇所を限定した比較や追加の検証が必要になる。
また、評価方法そのものが変更された場合にも注意が必要である。例えば、同じ判定結果に対して、以前と異なる閾値や分類規則を適用すれば、正解率やエラー率が異なる場合がある。このとき、判断機構の構造と入力条件が維持されていても、評価結果だけが変化する可能性がある。
構造振動モデルの観測写像を用いる場合、評価方法が観測結果の生成に含まれているなら、その規則も比較の前提として明示する必要がある。評価方法の変更を環境条件の一部として記録する方法もあれば、実際のシステム出力と評価によって得られる数値を区別して記録する方法も考えられる。
いずれの場合も、構造、入力、評価方法が同時に変化している状態では、観測された出力差を一つの要因だけへ帰属させることは難しい。比較する条件を明確にすることで、どの変化を検証しているのかを特定できる。
11.7. 検証可能な命題と棄却条件を定義する
構造振動モデルを説明装置として利用する場合には、どのような観測結果が得られれば仮説を支持し、どのような結果が得られれば仮説を見直す必要があるかを定めることが重要になる。
例えば、特定の例外経路を削除すると競合によるエラー率が低下する、という仮説を考える。この仮説を検証するには、削除する経路、競合として数える事象、エラー率の計算方法、比較する入力条件、観測期間を定義する必要がある。
仮に、競合によるエラー率を \(R_t\) とし、構造変更によって同じ入力条件の下でエラー率が低下するという仮説を立てたとする。比較可能な条件の下で、介入前後のエラー率が次の関係になることが、予測される結果である。
\[
R_{\mathrm{after}}<R_{\mathrm{before}}
\]
この不等式は、介入後のエラー率が介入前より小さいことを表す。ただし、実際の検証では、観測値には偶然的な変動があるため、一回の測定結果が不等式を満たすことだけで因果効果を確定できるわけではない。
仮説を検証可能な形にするには、どの程度の差を評価するか、測定のばらつきをどう扱うか、観測期間をどのように設定するかを定める必要がある。また、介入によってエラーが検出されなくなっただけではないことを確認するため、監視方法やエラーの定義も維持する必要がある。
例えば、同じ負荷条件で十分な観測を行っても、競合によるエラー率が低下せず、むしろ増加する結果が一貫して得られた場合、その経路削除がエラー率を低下させるという仮説は支持されない。逆に、エラー率が低下しても、同時に監視規則が変更されていた場合には、その結果だけで仮説を支持することはできない。
構造振動モデルにおいては、構造の変化自体に関する仮説と、構造変更の運用上の効果に関する仮説も区別できる。
例えば、経路を一本削除したとき、固定された二値エッジ表現とユークリッド距離の下で構造振幅が 1 になるという命題は、構造の定義から直接計算できる。
\[
A_t=1
\]
この命題を確認するには、更新前後のエッジ集合を比較すればよい。指定した一本だけが削除され、他のエッジに変更がなければ、計算結果は 1 となる。
一方、その経路を削除することでエラー率が低下するという命題は、グラフの距離だけからは導けない。削除した経路が実際にエラーを生んでいたか、削除後に別の経路へ負荷が移ったか、環境条件が変化したかなどを確認する必要がある。
この二つの命題は、検証に必要な情報が異なる。前者は構造の記録と距離の定義によって確認できる。後者は構造更新の記録に加えて、環境条件、観測結果、比較方法、因果的な仮定を必要とする。
また、構造振動モデルという名称を、観測されたあらゆる変化へ事後的に適用するだけでは、個々の仮説を検証できない。例えば、構造が複雑化した場合も単純化した場合も、振幅が増加した場合も減少した場合も、すべてを説明できたと述べるだけでは、どの結果が仮説に反するのかが明確にならない。
検証可能な命題として扱うには、どの構造が、どの条件で、どの方向へ更新されると予測するのかを定める必要がある。例えば、観測された維持費用が一定の基準を超え、重要な機能を維持できる代替経路が存在する場合には、特定の例外経路を削除するという更新規則を定義できる。この規則を事前に固定しておけば、条件を満たしたときに実際にその更新が選択されるかを調べられる。
ただし、更新写像が人間の判断規則を記述する場合、その写像が予測するのは判断の結果であり、判断が運用上適切であったことではない。例えば、規則どおりに例外経路が削除されても、その結果として重大な障害が発生するなら、更新規則の妥当性を再検討する必要がある。
11.8. 構造の測定、観測、因果的な評価を分ける
構造振動モデルで確認できる情報は、構造の記録、観測結果の記録、介入の効果という複数の段階に分かれる。これらを区別すると、どの結論が数理的な定義から導かれ、どの結論が追加の観測や仮定を必要とするかを明確にできる。
| 検証対象 | 必要な情報 | 確認できる内容 | 確定できない内容 |
|---|---|---|---|
| 構造の同一性 | ノード、エッジ、重み、識別規則を記録する。 | 定義した構造表現において、二つの状態が一致するかを確認できる。 | 記録していない内部状態や運用結果の一致は保証されない。 |
| 構造振幅 | 埋め込み写像と構造間距離を定義する。 | 隣接時点間の構造差を測定できる。 | 変更の理由や運用上の効果は判定できない。 |
| 更新方向 | 複雑さの尺度 \(K\) を定義する。 | 選択した尺度における増減方向を確認できる。 | 他の複雑さ尺度や維持費用の増減までは確定しない。 |
| 観測可能性 | 識別対象の構造、環境条件、観測写像、必要に応じて状態遷移を定義する。 | どの観測条件で構造の違いを識別できるかを検討できる。 | 観測されない内部の違いを、出力だけから特定できるとは限らない。 |
| 運用結果の変化 | 入力条件、測定方法、観測期間、結果の数値を記録する。 | エラー率や応答時間などが、観測期間の間でどう推移したかを確認できる。 | 観測結果の差を構造変更の因果的な効果と断定することはできない。 |
| 介入の因果的な効果 | 介入内容、比較対象、環境条件、観測結果、因果的な仮定を定義する。 | 条件が満たされる範囲で、介入による結果の差を推定・検証できる。 | 比較に必要な条件が欠けていれば、介入だけに原因を帰属できない。 |
| 更新規則の妥当性 | 更新写像、目的、制約、予測する結果、棄却条件を明示する。 | 定めた条件の下で規則が予測どおりに働くかを検証できる。 | 規則に従ったことだけで、運用上望ましい結果が保証されるわけではない。 |
この整理によって、構造振動モデルが直接測定できる範囲と、追加の検証を必要とする範囲を区別できる。構造をグラフとして記録すれば、どの関係が追加または削除されたかを確認できる。埋め込み写像と距離を定義すれば、その更新の大きさを測定できる。複雑さの尺度を定めれば、選択した尺度における増減方向を確認できる。
一方、構造変更によって障害が減少したかどうかを評価するには、観測結果と環境条件が必要になる。さらに、その減少が構造変更によって生じたと主張するには、介入の有無を比較できる条件や、因果関係についての仮定が必要になる。
ここで、構造の更新履歴が正確に記録されていることは、介入効果を検証するための重要な前提となる。例えば、複数のエッジを同時に変更したにもかかわらず、一つのエッジだけを変更したものとして記録していれば、どの介入の効果を比較しているのかが不明確になる。また、更新の途中で別の設定変更が行われていた場合、その変更も結果へ影響している可能性がある。
構造更新を数学的に定義することは、こうした検証上の問題を自動的に解消するものではない。しかし、構造、観測、環境、介入を区別して記録することで、何が変更され、何が観測され、どの因果的な説明が追加の検証を必要とするかを明確にできる。
構造振動モデルが説明装置として機能する範囲は、構造の表現規則、観測写像、更新写像、介入の定義、比較条件、棄却条件を具体的に設定できる範囲である。例えば、ある経路の削除によって競合が減少するという仮説は、削除する経路、競合の定義、入力条件、評価期間を定めることで検証対象にできる。一方、構造に何らかの変化が生じたという理由だけで、その変化をすべて構造振動の効果として説明することはできない。
構造振動モデルにおいて、構造の更新量を測定することと、その更新が何を引き起こしたかを検証することは、異なる作業である。構造振幅と更新方向は、定義された構造の変化を表す。観測可能性は、その構造についてどの情報を取得できるかを制約する。介入効果の評価は、観測された差と因果的な効果を区別するための条件を必要とする。
12. 構造振動モデルが成立する条件
構造振動モデルは、関係を持つ複数の要素が、環境条件、観測結果、介入に応じて再編成される過程を記述するための枠組みである。初期設計では、未知の要求や障害に備えて関係を追加することが合理的になる場合がある。一方、運用によって使用頻度や維持費用が明らかになると、既存の関係を削除したり、複数の経路を統合したりする判断が合理的になる場合がある。
この二つの判断は、必ずしも矛盾していない。判断が行われた時点で利用できる情報、避けるべき損失、守るべき制約が異なるからである。設計時には機能不足を避けることが重視され、運用後には不要な依存関係や維持費用を減らすことが重視される場合がある。さらに、新しい要求や環境の変化によって、いったん削除した関係とは異なる関係を追加する必要が生じることもある。
構造振動モデルでは、このような判断と構造更新の過程を、構造、環境、観測、介入の関係として記述する。概念的な説明を数学的な対象へ対応づけることで、何が更新されたのか、その変更量をどのように測るのか、どの条件で更新が選択されたのかを区別できる。
ただし、数式を定義しただけで、あらゆる構造更新の原因を説明できるわけではない。また、構造振動という名称から、周期的な往復運動や、複雑化と単純化の必然的な交代が導かれるわけでもない。モデルが何を記述でき、何を測定でき、どの条件で予測や検証に利用できるかを明確にする必要がある。
12.1. 概念上の再編成を数学的な状態として表す
構造振動モデルの出発点は、構造を、単なる要素の集合ではなく、要素間の関係を含む対象として扱うことである。例えば、ソフトウェアでは、同じ四つの部品が存在していても、どの部品がどの部品を呼び出すかによって、処理経路や依存関係が異なる。
そのため、時刻 \(t\) の構造を、有向重み付きグラフとして定義する。
\[
S_t=(V_t,E_t,W_t)
\]
\(V_t\) は構成要素の集合、\(E_t\) は要素間の有向関係の集合、\(W_t\) は各関係に割り当てる重みを表す。関係が存在するかどうかだけを測定する場合には、重みを 1 として扱うことができる。一方、通信時間や依存度などを重みとして使用する場合には、測定対象と単位を明示しなければならない。
この形式によって、構造更新を異なる種類の操作として表せる。部品の追加や削除は要素集合の変更であり、処理経路の追加や削除は関係集合の変更である。関係を維持したまま、その関係に付随する数量的な性質が変化する場合には、重みの変更として表現できる。
ただし、このグラフが実際の対象のすべてを表しているとは限らない。例えば、部品間の呼び出し関係だけを記録する場合には、内部の関数構成や処理条件の変化を検出できないことがある。グラフとして記録される構造は、分析目的に応じて選択された対象の表現である。
構造振動モデルを利用するためには、何をノードとし、何をエッジとし、どの属性を重みとして記録するかを定める必要がある。さらに、異なる時点の同じ部品を追跡できる識別規則も必要となる。
例えば、部品の名称を変更しただけで別のノードとして数える場合、名称変更が構造更新として計上される。一方、部品の識別子を維持したまま責務が変更された場合、責務の変更を記録する規則がなければ、その変化を検出できない。構造差の測定結果は、構造の定義と識別規則に依存する。
したがって、構造振動モデルの最初の成立条件は、比較対象となる構造を、時点を通じて対応づけられる形式で記録することである。これが満たされなければ、観測された差が実際の構造更新によるものなのか、表現方法の違いによるものなのかを区別できない。
12.2. 構造振幅を測定するには共通の距離が必要になる
各時点の構造を定義できたとしても、二つの構造の違いを一つの数値として比較する方法は、自動的には決まらない。例えば、エッジを一本追加する操作と、ノードを一つ分割する操作を、どちらも変更量 1 として扱うべきかどうかは、比較の目的によって異なる。
構造振動モデルでは、構造を共通の数値空間へ変換する埋め込み写像を定義し、その空間で距離を測定する方法を採用できる。
\[
\phi:\mathcal{S}\to\mathbb{R}^{n}
\]
\[
x_t=\phi(S_t)
\]
\(\mathcal{S}\) は比較対象となる構造の集合、\(\mathbb{R}^{n}\) は \(n\) 個の実数からなるベクトル空間である。\(\phi\) は、構造を入力として受け取り、共通の規則によって数値ベクトルへ変換する写像である。
埋め込み後のユークリッド距離を使用する場合、二つの構造間距離は次のようになる。
\[
d(S_a,S_b)=\|\phi(S_a)-\phi(S_b)\|_2
\]
これを用いて、時刻 \(t-1\) から時刻 \(t\) への構造振幅を定義する。
\[
A_t=d(S_t,S_{t-1})
=\|\phi(S_t)-\phi(S_{t-1})\|_2
\]
\(A_t\) は、隣接する二つの時点で、採用した構造表現がどの程度変化したかを表す量である。構造振幅は常にゼロ以上となる。
\[
A_t\ge0
\]
例えば、比較対象となるエッジを固定し、その有無を 0 と 1 で並べる場合、エッジ一本の追加による構造振幅は 1 となる。一本の削除でも同じ値になる。二本のエッジが追加または削除された場合には、構造振幅は \(\sqrt{2}\) となる。
この二値表現では、構造振幅の二乗が、追加または削除されたエッジの本数に一致する。
\[
A_t^2=|E_t\triangle E_{t-1}|
\]
\(\triangle\) は集合の対称差を表し、二つの関係集合のうち、片方にだけ存在するエッジを取り出す操作である。この関係によって、構造振幅を具体的な変更本数と対応づけられる。
ただし、この式は、固定されたエッジ候補について存在の有無だけを記録し、ユークリッド距離を採用した場合の性質である。エッジの重みを連続値として測定する場合や、別の埋め込み写像を利用する場合には、構造振幅の数値と変更本数の関係も異なる。
また、埋め込み写像が元の構造の情報を完全に保持していない場合、異なる構造が同じベクトルへ変換されることがある。例えば、ノード数とエッジ数だけを記録する場合、接続先が異なる二つのグラフでも、ノード数とエッジ数が一致していれば距離はゼロになる。
この場合、構造振幅がゼロであることから、元の構造全体が同一であるとは結論できない。厳密には、異なる構造の距離もゼロとなることを許す擬距離による測定となる。
したがって、構造振幅の意味を定めるには、埋め込み写像、距離、保持される特徴、失われる情報を明示する必要がある。振幅の数値だけではなく、何についての差を測定した数値なのかを示すことが、比較可能性の条件となる。
12.3. 構造の変化量と更新方向は別の性質である
構造振幅を測定できても、構造が複雑化したのか単純化したのかは、その数値だけでは判断できない。例えば、エッジ一本の追加と一本の削除は、二値ベクトルのユークリッド距離ではどちらも振幅 1 となる。構造振幅は変更の大きさを表すが、追加と削除の向きは保持しない。
更新方向を評価するためには、構造の複雑さを表す尺度 \(K\) を別に定義する。
\[
K:\mathcal{S}\to\mathbb{R}
\]
例えば、エッジ数を複雑さの尺度とする場合には、次のようになる。
\[
K(S_t)=|E_t|
\]
時刻 \(t\) における複雑さの増減は、隣接する二つの時点の差として定義する。
\[
\Delta K_t=K(S_t)-K(S_{t-1})
\]
\(\Delta K_t\) が正なら選択した尺度が増加し、負なら減少する。ゼロなら尺度の値は同じである。ただし、ゼロであっても、エッジの接続先を付け替えるような構造更新が発生している可能性がある。
このため、構造振幅 \(A_t\) と複雑さの差分 \(\Delta K_t\) を組み合わせることに意味がある。構造振幅はどの程度の変更が行われたかを表し、複雑さの差分は選択した尺度がどちらへ変化したかを表す。
例えば、エッジ一本を削除し、別の一本を追加した場合を考える。変更されたエッジは二本であるため、二値表現による構造振幅は \(\sqrt{2}\) となる。しかし、エッジ数は変わらないため、複雑さの差分はゼロとなる。
\[
A_t=\sqrt{2},\qquad \Delta K_t=0
\]
この結果は、構造の変更規模と、エッジ数の純増減が異なる量であることを示している。
さらに、複雑さの増減方向が反転したかどうかを調べる場合には、隣接する差分の符号を比較できる。
\[
\Delta K_t\Delta K_{t-1}<0
\]
この不等式が成立する場合、選択した尺度において、増加から減少、または減少から増加への反転が生じている。ただし、途中に差分がゼロとなる時点を挟む場合は、どのように反転を数えるかを別に定義する必要がある。
また、エッジ数を複雑さの尺度とする場合と、依存関係の集中度を尺度とする場合では、同じ構造更新に対して異なる方向が観測される可能性がある。例えば、エッジ数を増やしながら、特定の部品に集中していた依存関係を分散させる更新が考えられる。この場合、関係数は増加しても、依存関係の集中度は減少する可能性がある。
したがって、複雑化と単純化は、評価する尺度に対して定義される性質である。エッジ数の増加を観測したことから、すべての意味で構造が複雑になったと判断することはできない。構造更新の方向を説明する際には、どの尺度を採用したかを明示する必要がある。
12.4. 環境・観測・介入を分けることで更新機構を記述できる
構造の状態と変化量を測定できるようになっても、なぜその更新が選択されたのかは、距離の計算だけでは分からない。例えば、同じ一本のエッジ追加であっても、未知の障害への備えとして追加した場合と、実際に発生した障害への対応として追加した場合では、判断に利用された情報が異なる。
この違いを表現するため、構造振動モデルでは、構造 \(S_t\)、環境条件 \(C_t\)、観測結果 \(O_t\)、介入 \(U_t\) を区別する。
構造と環境から観測結果を得る関係は、次の式で表す。
\[
O_t=G(S_t,C_t)
\]
\(G\) は観測写像である。同じ構造であっても、入力件数、入力の種類、外部サービスの状態などが異なれば、観測されるエラー率や応答時間が変化する場合がある。そのため、観測結果の変化を構造更新によるものと判断するには、環境条件も確認する必要がある。
構造の更新は、次の式で表す。
\[
S_{t+1}=M(S_t,C_t,O_t,U_t)
\]
\(M\) は更新写像であり、現在の構造、環境、観測、介入を入力として受け取り、次の構造を定める。更新写像には、どの条件で関係を追加するか、削除するか、維持するかという判断規則が含まれる。
さらに、環境の更新を次のように表す。
\[
C_{t+1}=H(C_t,O_t)
\]
\(H\) は環境更新写像である。例えば、障害の報告を受けて利用者の操作方法が変更され、その結果として次の時点の入力条件が変化する場合に対応する。
三つの式をまとめると、次のようになる。
\[
\begin{aligned}
O_t&=G(S_t,C_t)\\
S_{t+1}&=M(S_t,C_t,O_t,U_t)\\
C_{t+1}&=H(C_t,O_t)
\end{aligned}
\]
この定式化では、現在の構造が環境の下で動作して観測結果を生み、その観測結果が次の構造や環境を決める情報として利用される。更新後の構造は、新しい環境条件の下で再び観測される。この循環によって、構造更新と運用観測の相互作用を記述できる。
例えば、入力検証で拒否された要求の内容を把握できないという問題が観測された場合、記録経路を追加する介入が選択されることがある。新しい経路によって拒否された要求を記録できれば、次の観測では以前より詳しい情報が得られる。その情報によって入力手順が改善されれば、拒否される要求の頻度が変化する可能性がある。
このとき、構造の追加によって新しい観測が可能になり、その観測によって次の判断条件が変化する。構造が環境に応じて更新されるだけでなく、構造更新によって観測できる情報そのものが変化する場合もある。
ただし、三つの写像を定義したことだけで、実際の更新結果を予測できるとは限らない。例えば、更新写像 \(M\) が具体的にどの条件でどのエッジを追加するかを定めていなければ、次の構造を計算できない。また、環境に外部から独立して到来する要求が存在する場合には、その外生的な条件もモデルに含める必要がある。
実際の観測に偶然的な変動や測定誤差が存在する場合には、決定的な観測写像だけでは十分に表現できないこともある。その場合、確率的な観測過程や、観測されない環境条件を追加して扱う方法が考えられる。
構造振動モデルの状態遷移方程式は、構造更新の関係を整理する基本形式である。実際の動作を予測するためには、各写像の具体的な規則と、その規則が適用される条件を与える必要がある。
12.5. 振幅の減衰、収束、周期性、安定性は別々に検証する
構造振動という名称は、構造が時間とともに更新される動態を表すために用いるものである。そのため、物理的な調和振動のように、同じ状態が一定の周期で繰り返されることを、最初から仮定する必要はない。
例えば、初期設計で複数の関係を追加し、その後の運用で不要な関係を削除し、一定期間変更が発生しなくなる場合がある。また、新しい要求によって再び大きな更新が生じる場合もある。これらの更新の間隔は一定とは限らず、更新方向が必ず交互に反転するという規則も存在しない。
構造の時間的な性質を評価する際には、異なる数学的な条件を区別する必要がある。
まず、構造振幅がゼロへ近づく条件は次のようになる。
\[
A_t\to0
\]
これは、隣接時点間の構造差が次第に小さくなることを表す。ただし、この条件だけでは、特定の構造への収束は保証されない。
第9.2節で示した対数の数列では、隣接時点間の差がゼロへ近づいても、状態そのものは増加を続ける。したがって、振幅の減衰だけを収束の判定条件にはできない。
一方、構造振幅の総和が有限であり、埋め込み先が完備な距離空間である場合には、状態列の収束を導くための条件が得られる。
\[
\sum_{t=1}^{\infty}A_t<\infty
\]
この条件では、十分に後の二つの時点を選んだとき、その間の状態距離を任意に小さくできる。そのため、状態列はコーシー列となり、完備な空間では収束する。
ただし、ここで直接保証されるのは、距離を測定している空間における収束である。埋め込み写像が元の構造の違いを失っている場合や、収束先が認められる構造に対応しない場合には、元のグラフ全体が特定の構造へ収束したとは結論できない。
また、固定された有限個のエッジ候補について、存在の有無だけを記録する二値グラフでは、異なる構造間の距離に正の最小値が存在する。この場合、構造振幅がゼロへ収束すれば、ある時点以降は構造が変更されなくなる。連続値の重みを持つ構造と、有限の二値グラフでは、収束について成立する性質が異なる。
周期性についても、別の条件を必要とする。状態が一定の時点間隔で繰り返されるなら、ある正の整数 \(T\) について次の関係が成立する。
\[
S_{t+T}=S_t
\]
この関係が成立するかどうかは、構造の状態系列を調べて判定する必要がある。複雑さの差分が一度反転したという観測結果だけでは、周期性を導けない。
さらに、運用上の安定性は、構造が収束するかどうかとは別の評価を必要とする。例えば、構造が固定されても重要な処理を継続できなければ、運用上望ましい状態とはいえない。反対に、負荷に応じて構造が更新され続けていても、応答時間や障害発生率が許容範囲に収まっていれば、運用上の目的を達成している場合がある。
したがって、構造振動モデルで安定性を論じる場合には、振幅の減衰、状態の収束、周期性、有界性、運用上の要件を区別する必要がある。これらを一つの「安定した」という表現へまとめると、どの性質が実際に確認されたのかが不明確になる。
12.6. 構造更新の記述と介入効果の検証は異なる
構造振動モデルによって、どの時点でどの関係が追加または削除されたかを記録できる。しかし、その更新が運用上の改善を生んだかどうかは、構造の記録だけでは判断できない。
例えば、例外経路を削除した後にエラー率が低下した場合を考える。構造更新の前後でエラー率に差があったことは、運用記録から確認できる。しかし、同じ期間に入力の種類や件数が変化していれば、エラー率の低下には環境条件が影響している可能性がある。
さらに、例外経路の削除によってエラーの記録方法が変化した場合には、実際の問題が減少していなくても、記録されたエラー件数だけが減る可能性がある。この場合、観測値の変化をそのまま運用改善と判断することはできない。
構造振動モデルでは、こうした違いを、構造 \(S_t\)、環境 \(C_t\)、観測結果 \(O_t\)、介入 \(U_t\) の区別によって扱う。しかし、介入変数を定義しただけで、介入の因果的な効果が自動的に求められるわけではない。
介入の効果を考える場合、本来は同じ条件で介入を行った場合と行わなかった場合の結果を比較したい。しかし、同一の対象について、同じ時点に両方の結果を観測することは通常できない。そのため、介入の効果を検証するには、比較対象と比較条件を適切に設定する必要がある。
例えば、特定の競合経路を削除するとエラー率が低下するという仮説を検証するなら、削除する経路、競合として数える事象、入力条件、観測期間、エラー率の計算方法を事前に定義する必要がある。
比較可能な条件の下で、介入後のエラー率が介入前より小さくなるという予測は、次のように表せる。
\[
R_{\mathrm{after}}<R_{\mathrm{before}}
\]
ただし、観測値には偶然的な変動があるため、一回の測定結果がこの不等式を満たしたことだけで、介入の効果が確定するわけではない。実行条件の違い、入力分布の変化、観測方法の変更などを確認する必要がある。
逆に、比較可能な条件で十分な測定を行ってもエラー率が低下せず、むしろ増加する結果が一貫して得られた場合には、経路削除によってエラー率が低下するという仮説は支持されない。その場合、更新を選択した判断規則や、想定していた障害の発生機構を再検討する必要がある。
このように、構造更新の履歴を記録することと、その更新の効果を検証することは異なる。前者では、構造の表現規則と距離の定義が重要になる。後者では、環境条件、観測方法、比較対象、因果的な仮定が重要になる。
構造振動モデルが実際の運用改善を説明するためには、構造の変化が記録されているだけでなく、変更の目的、選択した介入、期待した結果、実際の観測結果が対応づけられている必要がある。
12.7. モデルの記述範囲と検証条件を整理する
ここまでの定義を整理すると、構造振動モデルには、構造を記録するための条件、構造差を測定するための条件、更新過程を説明するための条件、介入の効果を検証するための条件がある。
これらは同じ段階の条件ではない。例えば、構造をグラフとして記録し、構造間距離を計算するだけなら、介入の因果効果まで推定できる必要はない。一方、特定の介入が障害を減らすと主張する場合には、構造の記録だけでは不十分であり、比較可能な観測条件を必要とする。
適用範囲を定めるうえでは、構造の比較可能性、距離の測定可能性、介入効果の識別可能性を区別する。ノードの識別規則と記録粒度が維持されれば構造を比較でき、共通の埋め込み写像と距離が定まれば振幅を測定できる。介入による運用結果の改善を主張する段階では、さらに比較可能な環境条件と一貫した観測規則が必要となる。
一方、構造の記録が不完全であったり、観測方法が途中で変更されていたりする場合には、数値の比較可能性が失われることがある。例えば、ある時点からノードの分割粒度を変更した場合、ノード数やエッジ数の増加が、実際の構造更新によるものか、表現方法の変更によるものかを区別できない可能性がある。
同様に、構造の更新前後でエラーの検出規則を変更した場合には、エラー率の変化をそのまま介入の効果として扱えない。モデルを適用する際には、何が実際に更新されたのかだけでなく、測定と評価の条件が維持されているかを確認する必要がある。
また、構造振幅が測定できることは、その振幅に対応する更新が合理的だったことを意味しない。例えば、重要な処理経路を削除した場合にも構造振幅は計算できる。しかし、その削除によって障害が増加するなら、更新の妥当性を別に評価しなければならない。
構造振動モデルにおける記述可能性と、構造更新の合理性は異なる問題である。構造を数値化できることと、その構造が運用上望ましいことを混同しないことが、モデルを実際の判断へ利用するための条件となる。
12.8. 構造振動モデルが説明するもの
構造振動モデルの中心にあるのは、構造が維持されながら再編成されるという時間的な過程である。各時点の構造は、それ以前の構造と無関係に現れるわけではない。既存の部品と関係を引き継ぎながら、必要な箇所が追加、削除、統合、分割される。その結果として、新しい構造が形成される。
この更新は、必ずしも一方向に進まない。例えば、未知の要求に対応するために関係を追加し、運用結果から維持費用が大きいことが分かれば関係を削除する場合がある。その後、新しい要求が発生すれば、再び関係を追加する可能性がある。
このような複雑化と単純化の交代は、構造が一定周期で往復するという性質を必要としない。更新が選択される理由は、それぞれの時点で利用可能な情報と、回避すべき損失、維持すべき制約によって異なる。
数理的には、構造を \(S_t\) として記録し、隣接時点間の距離を \(A_t\) として測定することで、どの程度の更新が行われたかを表せる。さらに、複雑さの尺度 \(K\) を導入すれば、選択した尺度での更新方向を区別できる。
観測結果と更新の関係は、\(G\)、\(M\)、\(H\) という写像を用いて記述できる。これによって、同じ構造であっても環境条件が異なれば観測結果が変化し得ることや、同じ観測結果であっても更新規則が異なれば別の構造が選択され得ることを表現できる。
ただし、これらの定義から、構造が必ず複雑化と単純化を交互に繰り返すという結論は導かれない。構造が一方向へ更新され続ける場合も、一定の範囲で更新を繰り返す場合も、変更が停止する場合もある。どの性質が成立するかは、構造空間、距離、更新写像、環境更新写像の具体的な定義によって決まる。
構造振動モデルが提供するのは、こうした異なる状態遷移を同じ形式で記述し、必要な指標を区別して検証するための方法である。構造がどの程度変化したかという問いと、どちらへ変化したかという問いを分けられる。さらに、なぜ変更が選択されたかという問いと、その変更が運用結果を改善したかという問いも分けられる。
例えば、ある期間にエッジの追加と削除が繰り返され、最終的に初期構造へ戻った場合、開始時点と終了時点だけを比較すると構造間距離はゼロになる。しかし、各時点の構造を記録していれば、その間にどの関係が追加され、どの関係が削除されたかを確認できる。構造の最終状態と、そこへ至る更新履歴は異なる情報である。
また、エッジ一本の追加と一本の削除では、構造振幅が同じになる場合がある。しかし、複雑さの差分を併せて測定すれば、更新方向を区別できる。さらに、環境と観測、介入の記録が存在すれば、それぞれの操作が選択された条件を検討できる。
構造振動モデルの価値は、構造が必ず一定周期で複雑化と単純化を繰り返すと予言することにはない。構造の更新前後で何が維持され、何が変更され、どの条件でその更新が選択されたかを、一貫した形式で記述できる点にある。
そのためには、構造の表現規則を固定し、構造間距離を定義し、更新方向を評価する尺度を明示する必要がある。さらに、更新の原因や効果を論じる場合には、環境条件、観測結果、介入、更新規則を区別し、比較可能な条件を設定しなければならない。
構造を維持しながら再編成するという概念は、関係構造の時系列を記録し、更新の規模と方向を数値化し、環境・観測・介入との対応を明示することで、数学的な状態遷移として表現される。構造振動モデルが成立する条件は、この記述と測定の前提を明確にし、さらに主張する結論に応じた検証条件を満たすことである。
参考文献
- id774, 構造振動モデルとは何か(2026-02-17). https://blog.id774.net/entry/2026/02/17/3666/
- id774, 構造振動モデルを数理モデルとして定義する(2026-04-05). https://blog.id774.net/entry/2026/04/05/4318/
- Herbert A. Simon, A Behavioral Model of Rational Choice(1955-02-01). https://academic.oup.com/qje/article-abstract/69/1/99/1919737
- F. A. Hayek, The Use of Knowledge in Society(1945-09). https://www.jstor.org/stable/1809376
- Daniel Kahneman and Amos Tversky, Prospect Theory: An Analysis of Decision under Risk(1979-03). https://web.mit.edu/curhan/www/docs/Articles/15341_Readings/Behavioral_Decision_Theory/Kahneman_Tversky_1979_Prospect_theory.pdf
- John Sweller, Cognitive Load During Problem Solving: Effects on Learning(1988-04). https://onlinelibrary.wiley.com/doi/10.1207/s15516709cog1202_4
- Don Norman, The Design of Everyday Things(2013-11-05). https://www.hachettebookgroup.com/titles/don-norman/the-design-of-everyday-things/9780465072996/?lens=basic-books
- ISO, ISO 9241-210:2019 — Ergonomics of human-system interaction — Part 210: Human-centred design for interactive systems(2019-07). https://www.iso.org/standard/77520.html
- Claude E. Shannon, A Mathematical Theory of Communication(1948-07). https://onlinelibrary.wiley.com/doi/10.1002/j.1538-7305.1948.tb01338.x
- Hirotugu Akaike, A New Look at the Statistical Model Identification(1974-12-31). https://doi.org/10.1109/TAC.1974.1100705
- Jorma Rissanen, Modeling by Shortest Data Description(1978-09). https://www.sciencedirect.com/science/article/pii/0005109878900055
- id774, 構造振動モデルによるソフトウェア設計の理解(2026-02-24). https://blog.id774.net/entry/2026/02/24/3804/
- id774, 続・構造振動モデルによるソフトウェア設計の理解(2026-02-28). https://blog.id774.net/entry/2026/02/28/3846/
- Fan R. K. Chung, Spectral Graph Theory(1997). https://fanchung.ucsd.edu/book.html
- Xinbo Gao, Bing Xiao, Dacheng Tao and Xuelong Li, A Survey of Graph Edit Distance(2009-01-13). https://doi.org/10.1007/s10044-008-0141-y
- Fenxiao Chen, Yun-Cheng Wang, Bin Wang and C.-C. Jay Kuo, Graph Representation Learning: A Survey(2020-05-28). https://www.cambridge.org/core/journals/apsipa-transactions-on-signal-and-information-processing/article/graph-representation-learning-a-survey/23B9870F91F7E6DA14784959A9BC9E7A
- Seyed Mehran Kazemi, Rishab Goel, Kshitij Jain, Ivan Kobyzev, Akshay Sethi, Peter Forsyth and Pascal Poupart, Representation Learning for Dynamic Graphs: A Survey(2020). https://www.jmlr.org/papers/v21/19-447.html
- Petter Holme and Jari Saramäki, Temporal Networks(2012-03-06). https://piccardi.faculty.polimi.it/VarieCsr/Papers/Holme2012.pdf
- R. E. Kalman, A New Approach to Linear Filtering and Prediction Problems(1960-03-01). https://doi.org/10.1115/1.3662552
- Karl J. Åström and Richard M. Murray, Feedback Systems: An Introduction for Scientists and Engineers(2008). https://www.cds.caltech.edu/~murray/amwiki/First_Edition.html
- Juan A. Acebrón, Luis L. Bonilla, Conrad J. Pérez Vicente, Félix Ritort and Renato Spigler, The Kuramoto Model: A Simple Paradigm for Synchronization Phenomena(2005-04-07). https://doi.org/10.1103/RevModPhys.77.137
- John H. Holland, Complex Adaptive Systems(1992). https://www.jstor.org/stable/20025416
- Judea Pearl, Causality: Models, Reasoning, and Inference(2009). https://www.cambridge.org/core/books/abs/causality/contents/E62B1C761BC88EF7A8FE13A25FDFBBCD
- Miguel A. Hernán and James M. Robins, Causal Inference: What If(2020). https://miguelhernan.org/whatifbook
- id774, 安全判定の揺らぎを入力・構造・評価方法に分けて測る(2026-10-21). https://blog.id774.net/entry/2026/10/21/5796/