함수공간 function space ref
- 함수들의 집합 가 벡터공간이면, 를 함수공간이라 부른다
- 함수공간 에서의 내적은 다음과 같이 정의된다
-
- 주요하게 다루는 함수공간은 다음과 같다
- 연속함수공간
-
-
바나흐 공간Banach space
- 완비complete metric노름공간이다
- 완비complete metric
- 그 안이나 경계에 빠진점이 없는 거리공간
- 점들의 사이가 점점 가까워지는 코시열이 모두 수렴하는 점을 가질때 완비성을 지녔다고 말한다
- 노름공간normed space
- 벡터의 '크기'가 정의된 벡터공간을 지칭한다
- 내적공간은 노름공간의 일종이다.
- 힐버트 공간은 완비내적공간complete inner product space로, 바나흐 공간의 일종이다.
compactness
- (대략) 무한히 뻗어나가지 않고 유한한 성질
- 유계(집합 에 대하여 집합 에 속하는 모든 원소보다 크거나 같은수, 작거나 같은수가 모두 존재할때를 부르는 개념)의 일반화된 개념이다.
- 유클리드 공간의 부분집합의 경우, 닫힌 유계집합과 동치이다
작용소 operator (in Functional Analysis)
- 노름 공간에서 노름공간 으로 대응하는 사상
- 이때 , 에 대하여 가 일경우 를 선형 작용소라고 칭한다.
Trunk와 Branch (in CNN)
- Trunk network는 이미지 픽셀 전체를 학습하는 네트워크이고, branch network는 이미지의 국소영역을 학습하는 네트워크이다
inductive bias
- 주어지지 않은 입력의 출력을 예측하는 것으로, 일반화 성능을 높이기 위해 추가적인 가정을 한다
- CNN에서는 locality(한 픽셀은 주변 픽셀과 서로 관계를 갖는다), translation invariance(이미지를 평행이동켜 그곳에서 출력된 값이 기존 값과 다르지 않을 것이라는 가정)을 갖는다
- RNN는 Sequential(입력이 시계열의 특징을 갖는다), Temporal Invariance(동일한 순서로 입력이 들어오면 출력도 동일하다)는 가정
시스템 식별system identification
- 시스템의 분류
- white box model : 모델이 물리법칙으로 표현가능하며, 변수도 모두 아는 모델
- gray box model: 어느정도 물리법칙으로 표현 가능하며 변수도 어느정도 알고있는 모델
- black box model:모델이 물리법칙으로 표현하기 어렵고, 변수도 알기 어려운 모델
- 신호처리signal processing의 한 분야로써, 시스템의 입력과 출력데이터를 활용하여 수학적 모델을 얻기 위한 방법론이다
chebyshev 다항식
-
- 해는 를 만족한다
- Chebyshev polynomial 테이블
-
-
-
-
- ...
확률 과정 stochastic process 및 무작위장 random field
- ref
- 시간의 진행에 따라 확률적인 변화를 갖는 구조이다
- 확률과정 정의
- 파라미터 공간 가 주어졌을 때, 에 대한 확률과정 은 다음의 확률변수들의 집합이다
-
- 무작위장 정의
- 가 차원의 집합이라면, 확률변수 는 차원의 벡터를 갖는 변수이고, 이를 잇는 함수 를 의 무작위장이라 부른다
공분산행렬
- 확률변수 에 대하여 를 만족시키는 행렬
가우시안 변수
- 1차원
- 확률변수 의 분포가 를 따르면 가우시안 변수라고 부른다
- 다변수
- 확률변수 의 분포가 있다 하자.
- 확률변수 에 대한 평균벡터 와 공분산행렬 이 있다하자.
- 확률변수 의 분포가 이 식을 따르면 이를 다변수 가우시안 변수라 부른다
- 이때 를 마할라노비스 거리Mahalanobis distance라 부른다
-
-
-
- 공분산행렬 가 대칭행렬이기 때문에, 이 분포는 대칭의 형태를 갖고 있다.
가우시안 필드

가우시안 분포에서 추출한 픽셀 이미지
RBF(Radial Basis Function) / Gaussian Kernel ref
-
- 일단 일반성을 잃지않고, 로 두자
-
-
- 이라면
-
- 라는 상수로 둔다면
-
-

2개의 서브 네트워크를 갖는다
- trunk network
- 를 입력값으로 받고, 를 출력으로 한다
- trunk network는 마지막 층에 activation function이 적용된다 그러므로 이다
- branch network는 을 입력값으로 받고, 을 출력값으로 한다. (for )
이 둘의 결과를 결합하면 다음과 같다
-
- 다만 보편근사정리에서 위 공식에 bias 항이 필요하지 않음에도, bias는 generalization error를 줄이는데 기여하므로, 마지막 단계에서 추가한다
-
실전에서 는 최소 10 이상의 크기를 가져, 많은 수의 브랜치 네트워크가 연산적으로, 그리고 비용적으로 많이 나가게 된다
게다가 우리는 모든 브랜치 네트워크를 하나의 브랜치 네트워크로 통합하였기 때문에, 싱글 브랜치 네트워크는 의 크기를 갖는다
DeepONet는 높은 레벨의 네트워크 구조로써, 사전에 내부 트렁크 또는 브랜치 네트워크가 정의되어 있지 않는다.
- DeepONet가 혼자서 좋은 성능을 보이는 것을 설명하기 위해서, 이번 연구에서 가장 간단한 형태의 FNN을 서브네트워크로 삼는다
DeepONet의 성공은 이것의 서브 네트워크또한 강력한 inductive bias를 갖고 있기 때문이다. 신경망에 사전지식을 주입하는건 떄론 좋은 일반화 성능을 이끌어 낸다
- 는 와 라는 입력값을 갖고, 트렁크와 브랜치 네트워크는 이 사전지식을 활용한다
| cases | spaces | # sensors | # Training | # Test$ | # Iterations | Other parameters |
|---|---|---|---|---|---|---|
| 1.1 | GRF () | 100 | 10000 | 100000 | 50000 | k=1 ,T=1 |
| 1.2 | GRF () | 100 | 10000 | 100000 | 100000 | |
| 2 | GRF () | 100 | 10000 | 100000 | 100000 | |
| 3 | GRF () | 100 | 1000000 | 500000 |
deeponet.pyclass DeepONet(NN):
""" args:
layer_size_branch,layers_sizes_trunk: FNN의 폭을 지정한다. 이때 브랜치넷과 트렁크넷의 마지막층 폭의 크기는 항상 같아야 한다
activation: 활성화 함수를 지정한다. `string` 형태로 호출한다. 이때 브랜치넷과 트렁크넷의 활성화 함수는 동일해야 한다. 만약 activation이 dict형태라면 트렁크넷과 브랜치넷은 각각 activation['trunk'], activation['branch'] 를 활용한다
"""
def __init__(
self,
layer_sizes_branch,
layer_sizes_trunk,
activation,
kernel_initializer,
):
""" super().__init__(): torch.nn.NN의 성질을 계승받는다"""
super().__init__()
""" isintance(obj_name,dtype_name): 해당 데이터타입에 맞는지 확인하는 함수, 여기선 activiation이 dict인가 아닌가에 따라 분리로 나누었음."""
if isinstance(activation, dict):
activation_branch = activations.get(activation["branch"])
self.activation_trunk = activations.get(activation["trunk"])
else:
activation_branch = self.activation_trunk = activations.get(activation)
"""callable이란 호출가능한 클래스 인스턴스,함수,메서드등의 객체를 의미한다.
여기선 유저가 직접 정의 네트워크 형태가 있다면 이를 따르고, 아닌경우 트렁크와 브랜치 크기, 활성화함수,커널 초기화등의 인자를 입력받으면 FNN을 만들어줌 """
if callable(layer_sizes_branch[1]):
self.branch = layer_sizes_branch[1]
else:
self.branch = FNN(layer_sizes_branch, activation_branch, kernel_initializer)
self.trunk = FNN(layer_sizes_trunk, self.activation_trunk, kernel_initializer)
self.b = torch.nn.parameter.Parameter(torch.tensor(0.0))
def forward(self, inputs):
"""각각 함수값과 위치값을 inputs에서 분할하여 받는다"""
x_func = inputs[0]
x_loc = inputs[1]
"""함수값을 branch에 입력한다. branch는 변환후 함수에 대한 독립변수 y를 입력받고, trunk는 변환전 함수에 대한 독립변수 x를 입력받는다."""
x_func = self.branch(x_func)
# Trunk net to encode the domain of the output function
if self._input_transform is not None:
x_loc = self._input_transform(x_loc)
"""activation_trunk는 """
x_loc = self.activation_trunk(self.trunk(x_loc))
# Dot product
if x_func.shape[-1] != x_loc.shape[-1]:
raise AssertionError(
"Output sizes of branch net and trunk net do not match."
)
"""
torch.einsum : Einstein Summation Convention을 수행하는 명령어
내적과 외적, 행렬곱등의 연산들을 모두 einsum 하나로 표현가능하다
"ijk,jl ->ikl" 형식으로 작성한다
"""
x = torch.einsum("bi,bi->b", x_func, x_loc)
"""
squeeze:차원이 1인 차원을 제거한다 예: [3,1,20,128] ->[3,20,128]
unsqueeze:반대로 1인 차원을 생성한다. 따라서 어느 차원에 생성할지 지정해야 한다 예: [3,20,128] 에 unsqueeze(dim=1) 실시 => [3,1,20,128]
"""
x = torch.unsqueeze(x, 1)
# Add bias
x += self.b
if self._output_transform is not None:
x = self._output_transform(inputs, x)
return x
activations.pyfrom .. import backend as bkd
from .. import config
from ..backend import backend_name, tf
def linear(x):
return x
def layer_wise_locally_adaptive(activation, n=1):
if backend_name != "tensorflow.compat.v1":
raise NotImplementedError("Only tensorflow.compat.v1 backend supports L-LAAF.")
a = tf.Variable(1 / n, dtype=config.real(tf))
return lambda x: activation(n * a * x)
def get(identifier):
"""
함수를 반환한다
arguments: identifier: Function or string.
Returns: Function corresponding to the input string or input function. """
if identifier is None:
return linear
if isinstance(identifier, str):
if identifier.startswith("LAAF"):
identifier = identifier.split()
n = float(identifier[0].split("-")[1])
return layer_wise_locally_adaptive(get(identifier[1]), n=n)
"""identifier 이름을 key값으로 하여 딕셔너리서 원하는 함수를 찾아 반환받는다"""
return {
"elu": bkd.elu,
"relu": bkd.relu,
"selu": bkd.selu,
"sigmoid": bkd.sigmoid,
"silu": bkd.silu,
"sin": bkd.sin,
"swish": bkd.silu,
"tanh": bkd.tanh,
}[identifier]
if callable(identifier):
return identifier
raise TypeError(
"Could not interpret activation function identifier: {}".format(identifier)
)
안녕하세요~ UAT에서 c(ki), xi(kij)는 각각 weight이고, theta(ki), zeta(k)는 bias가 맞을까요?