이전 게시글(https://pasus.tistory.com/363)에서 함수
식 (1)에 의하면 HiPPO는 본질적으로 연속시간(continuous-time) 에서 정의된 상미분 방정식(ODE)을 기반으로 데이터의 상태를 업데이트한다. 그러나 센서 신호, 주가 데이터 등의 실제 데이터는 대부분 샘플링(sampling)으로 수집되므로, HiPPO를 실제 시스템에 적용하려면 연속시간 히포 미분방정식(continuous-time HiPPO ODE)을 이산시간(discrete-time) 차분 방정식(difference equation)으로 바꿀 필요가 있다.

히포 미분방정식은 시간에 따라 변화하는 시변(time-varying) 시스템으로, 시간
여기서는 forward Euler, backward Euler, bilinear에 대해서만 알아보고자 한다.
미분을 다음과 같이 근사화하는 방법을 오일러 근사(Euler's approximation)법이라고 한다.
여기서
식 (2)를 (1)에 대입하면 다음과 같다.
위 식은 다음과 같이 정리된다.
이산시간 시스템의 기호를 따르기 위하여 다음과 같이 정의하면,
다음과 같이 식 (1)에 대한 forward Euler 방식의 이산시간 등가 모델을 얻을 수 있다.
이번에는 식 (3)을 (1)에 대입하면 다음과 같다.
위 식을 정리하면 다음과 같다.
이산시간 시스템의 기호를 따르면 다음과 같이 식 (1)에 대한 backward Euler 방식의 이산시간 등가 모델을 얻을 수 있다.
식 (7)과 식 (10)은
Bilinear 변환은
식 (11)은 미래시간과 현재시간의 값을 이용한 forward 평균 근사이고, 식 (12)는 현재시간과 과거시간의 값을 이용한 backward 평균 근사다.
식 (11)과 (2)를 식 (1)에 대입하면 다음과 같다.
위 식은 다음과 같이 정리된다.
이산시간 시스템의 기호를 따르면 다음과 같이 식 (1)에 대한 forward bilinear 방식의 이산시간 등가 모델을 얻을 수 있다.
이번에는 식 (12)와 (3)을 식 (1)에 대입하면 다음과 같다.
위 식은 다음과 같이 정리된다.
이산시간 시스템의 기호를 따르면 다음과 같이 식 (1)에 대한 backward bilinear 방식의 이산시간 등가 모델을 얻을 수 있다.
식 (15)와 식 (18)은
계수 차분방정식 (8), (10), (15), (18)에 의하면 수식 상에 샘플링 간격
HiPPO가 시간 스케일에 독립적이라는 것은 다음과 같이 증명할 수 있다. 함수
여기서
HiPPO는 시간에 따라 변화하는 데이터를 직교 다항식 기반으로 최적화하여 식 (8), (10), (15) 또는 (18)을 이용하여 계수
다음은

다음 그림은

다음 그림은

다음은 해당 매트랩 코드다.
% Comparison among HiPPO ODE, forward Euler, backward Euler,
% and Bilinear forwad and backward methods
%
% (c) st.watermelon
clear;
% HiPPO setup
N = 10;
tf = 150;
dt = 0.1; % time interval
t_step = dt:dt:tf;
% HiPPO A, B
[A, B] = hippo_AB(N);
% input signal
f = @(t) cos(t/20).*sin(t/5);
ft_orig = f(t_step);
ft = ft_orig + 0.1 * randn(1,length(t_step));
% HiPPO ODE
hippo_ode = @(t, c) (-A / t) * c + (B / t) * f(t);
% initial condition
c0 = zeros(N, 1);
% 0. HiPPO ODE
[time, c_ode] = ode45(hippo_ode, t_step, c0);
% 1. forward Euler
c_euler_fwd = zeros(N, 1);
c_euler_fwd_history = zeros(length(t_step), N);
for k = 1:length(t_step)-1
c_euler_fwd = (eye(N) - A/k) * c_euler_fwd + (B/k) * ft(k);
c_euler_fwd_history(k+1, :) = c_euler_fwd';
end
% 2. backward Euler
c_euler_bwd = zeros(N, 1);
c_euler_bwd_history = zeros(length(t_step), N);
for k = 2:length(t_step)
M = eye(N) + A/k;
invM = inv(M);
c_euler_bwd = invM * c_euler_bwd + invM * (B/k) * ft(k);
c_euler_bwd_history(k, :) = c_euler_bwd';
end
% 3. bilinear forward
c_bi_fwd = zeros(N, 1);
c_bi_fwd_history = zeros(length(t_step), N);
for k = 1:length(t_step)-1
M = eye(N) + A/(2*(k+0));
invM = inv(M);
c_bi_fwd = invM * (eye(N) - A/(2*k)) * c_bi_fwd + invM * (B/k) * ft(k);
c_bi_fwd_history(k+1, :) = c_bi_fwd';
end
% 4. bilinear backward
c_bi_bwd = zeros(N, 1);
c_bi_bwd_history = zeros(length(t_step), N);
for k = 2:length(t_step)
M = eye(N) + A/(2*k);
invM = inv(M);
c_bi_bwd = invM * (eye(N) - A/(2*(k-0))) * c_bi_bwd + invM * (B/k) * ft(k);
c_bi_bwd_history(k, :) = c_bi_bwd';
end
%%
% fitting
cut = round(length(t_step)*1/2);
g = hippo_fit(c_bi_fwd_history(1:cut,:), dt);
% plotting
figure, plot(t_step, ft, '.', 'color', [.7 .7 .7]), hold on
plot(t_step, ft_orig, 'r')
plot(t_step(1:cut), g,'b', 'LineWidth', 1.2)
legend('noisy f(t)','f(t)','g(t)')
xlabel('Time');
title(['N = ' num2str(N)]);
%%
function g = hippo_fit(c, dt)
%
% g = hippo_fit(c, dt)
% HiPPO fitting
% input
% c(t): coefficients
% dt: sampling time interval
% output
% g: fitted function
%
% (c) st.watermelon
[k, N] = size(c);
g = [];
for ii=1:k
x = ii*dt;
sum = 0;
for n=0:N-1
p=LegendrePoly(n);
Pn=polyval(p,2*x/(k*dt)-1);
sum = sum + c(k, n+1)*sqrt(2*n+1)*Pn;
end
g = [g; sum];
end
end
%%
function lpoly = LegendrePoly(n)
%
% lpoly = LegendrePoly(n)
% N-th order Legendre polynomials
%
% input: order of Legendre polynomials
% output: polynomial coefficients
%
% (c) st.watermelon
for ii=0:n
if ii==0
p{ii+1}=1;
elseif ii==1
p{ii+1}=[1 0];
else
p{ii+1}=(2*ii-1)/ii*[p{ii} 0]-(ii-1)/ii*[0 0 p{ii-1}];
end
end
lpoly=p{n+1};
end
'AI 딥러닝 > Sequence' 카테고리의 다른 글
HiPPO - 2 (0) | 2025.01.09 |
---|---|
HiPPO - 1 (0) | 2025.01.08 |
[PtrNet] Pointer Net 구조 (0) | 2023.09.12 |
[seq2seq] 어텐션이 포함된 seq2seq 모델 (0) | 2023.08.23 |
[seq2seq] 간단한 seq2seq 모델 구현 (0) | 2023.08.17 |
댓글