ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • implicit network using siren
    AI Basic 2023. 2. 12. 02:27

    요즘 ai - deep learning 이 화두이다.

     

    나도 요즘 공부하면서 해당 network를 이용해서 구조에 대해서 설명해보려고 한다.

     

    유명한 cnn 이나 그런거 놔두고 생소한  implicit network를 선정한 이유는 데이터가 1개만 있어되고

     

    학습시간이 엄청 짧기 때문이다.

     

    그리고 해당 예제는 1D 이다. 그러므로 이해가 쉽다.

     

    https://github.com/freddiekimN/learning-implicit-network-siren/tree/siren_audio

     

    GitHub - freddiekimN/learning-implicit-network-siren: learning code for implicit network using siren

    learning code for implicit network using siren. Contribute to freddiekimN/learning-implicit-network-siren development by creating an account on GitHub.

    github.com

    에서 다운을 받아서 실행해보면

    gt_bach.wav 파일 입력을 받아서

    gt_bach_siren.wav 을 만드는 것을 볼 수 있습니다.

    참고로  https://vsitzmann.github.io/siren 사이트가 원조임.

    난 교육용으로 코드를 수정해서 올렸음을 알려드립니다.
     
    왼쪽이 수행 후 이고 오른쪽 training 전이다.

    입력 크기가 308207 x 1 이고 1 x 64 = 308207 x 64 입을 알 수 있다.

    bias 64 포함해서 첫 Linear-1 Param 128(64 + 64) 이다.

    두번째는 입력 308207 x 64 이고 64 x 64 =  308207 x 64

    bias 64 포함해서 Param 4160(4096 + 64 ) 이다.

    그리고 마지막으로

    입력이 308207 x 64 이고 64 x 1 = 308207 x 1 이니

    bias 1 포함 해서 65( 64 + 1 ) 임.

    ----------------------------------------------------------------
            Layer (type)               Output Shape         Param #
    ================================================================
                Linear-1           [-1, 308207, 64]             128
             SineLayer-2           [-1, 308207, 64]               0
                Linear-3           [-1, 308207, 64]           4,160
             SineLayer-4           [-1, 308207, 64]               0
                Linear-5           [-1, 308207, 64]           4,160
             SineLayer-6           [-1, 308207, 64]               0
                Linear-7           [-1, 308207, 64]           4,160
             SineLayer-8           [-1, 308207, 64]               0
                Linear-9            [-1, 308207, 1]              65
    ================================================================

    입력 개수는 308,207 의 개수를 사용해서 소리를 표현 했는데

    해당 네트워크는 12,673 개수를 사용해서 소리를 표현했으므로 메모리때문에 256 -->64로 변경했으므로

    4배 해도 (12,673x4) <<< 308,207 보다는 작다.

    implicit network는

    즉 해상도와 상관없고 왜 복잡도와 상관있다고 하는지 이해가 가는 대목이다.

     

    모델을 설명하기 전에 일반적으로 어떻게 학습이되는지 설명해보고자 한다.

    1. DataLoader를 이용해서 데이터 생성

    2. 모델 생성

    3. Optimizer설정

    4. next(ite(dataloader)) 이용해서 데이터 추출

    5. for 문 시작

    - 모델 입력에 넣음.

    - loss계산

    - optim.zero_grad()

    - loss.backward()

    - optim.step()

     

    이런 방식으로 진행이 될것이다. 여기서 데이터는 한개이므로 next가 한번만 불리지만 데이터가 여러개이면 여러번 불릴것이다.

    // 데이터 생성
    dataloader = DataLoader(bach_audio, shuffle=True, batch_size=1, pin_memory=True, num_workers=0)
    
    // 모델 생성
    audio_siren = siren.Siren(in_features=1, out_features=1, hidden_features=64, 
                        hidden_layers=3, first_omega_0=3000, outermost_linear=True)
    
    // optimizer 설정
    optim = torch.optim.Adam(lr=1e-4, params=audio_siren.parameters())
    
    model_input, ground_truth = next(iter(dataloader))
    
    for step in range(total_steps):
        model_output, coords = audio_siren(model_input)    
        loss = F.mse_loss(model_output, ground_truth)
        
        optim.zero_grad()
        loss.backward()
        optim.step()

     

    모델 구조 확인 1 x 64 --> 64 x 64 --> 64 x 64 --> 64 x 1

    Siren(
      (net): Sequential(
        (0): SineLayer(
          (linear): Linear(in_features=1, out_features=64, bias=True)
        )
        (1): SineLayer(
          (linear): Linear(in_features=64, out_features=64, bias=True)
        )
        (2): SineLayer(
          (linear): Linear(in_features=64, out_features=64, bias=True)
        )
        (3): SineLayer(
          (linear): Linear(in_features=64, out_features=64, bias=True)
        )
        (4): Linear(in_features=64, out_features=1, bias=True)
      )
    )

    자세한 설명. 사이트

    https://www.notion.so/Implicit-Representation-Using-Neural-Network-c6aac62e0bf044ebbe70abcdb9cc3dd1

     

    Implicit Representation Using Neural Network

    최근 딥러닝이 많은 주목을 받으면서 다양한 문제들을 딥러닝을 사용해서 풀고 있다. 하지만 우리가 흔히 보는 딥러닝 모델들은 주로 Convolutional Neural Network (CNN)이다. 큰 분야인 Computer vision이나

    www.notion.so

     

    요약
    해상도에 따라 파라메타 수가 증가하는것이 아니라 복잡도에 따라서 증가함
    sine파를 활성화 함수로 사용 함. 그러나 초기화를 잘 설정해야 성능을 뽑아 낼 수 있음.
    초기값은 feature 개수로 나눠서 uniform distribution이 처럼 weight를 일정하게 맞춤.
     
     
    if self.is_first:
        self.linear.weight.uniform_(-1 / self.in_features, 
                                     1 / self.in_features)      
    else:
        self.linear.weight.uniform_(-np.sqrt(6 / self.in_features) / self.omega_0, 
                                     np.sqrt(6 / self.in_features) / self.omega_0)
                                     
    audio_siren = siren.Siren(in_features=1, out_features=1, hidden_features=64, 
                        hidden_layers=3, first_omega_0=3000, outermost_linear=True)
                        
    # 처음 first_omega_0=3000
    # 그 다음 부터는 first_omega_0=30
    # 1/100로 작게함.

     

    Siren은 이미지, 오디오 및 비디오 같은 다양한 종류의 데이터를 다루는 딥러닝 모델에서 사용되는 함수 근사 기법입니다. Siren 네트워크는 각 레이어에 적용되는 사인 함수와 코사인 함수를 결합하여 입력 데이터를 출력 데이터로 매핑합니다.

    Siren 네트워크에서 초기화는 모델의 학습 결과에 매우 큰 영향을 미치는 중요한 단계입니다. 초기화는 가중치 매개변수를 무작위로 설정하는 것으로 시작합니다. 가중치가 잘 초기화되지 않으면, 모델은 수렴하지 않을 수 있으며, 좋지 않은 성능을 나타낼 수 있습니다.

    또한, Siren 모델에서는 초기화 방법도 중요합니다. 가중치를 초기화할 때 적절한 분산으로 초기화하면 학습이 빠르고 안정적으로 수행될 수 있습니다. 분산이 너무 작으면 모델이 underfitting되어 학습 데이터에 적합하지 않은 모델이 될 수 있으며, 분산이 너무 크면 모델이 overfitting되어 일반화하기 어렵게 됩니다.

    따라서 Siren 모델에서는 초기화 단계에서 적절한 가중치 값을 설정하는 것이 매우 중요합니다. 일반적으로, 초기화 방법으로는 Glorot 초기화나 He 초기화와 같은 기법을 사용하는 것이 좋습니다. 이러한 초기화 기법은 분산을 적절하게 조절하여 모델이 잘 수렴하도록 돕습니다.

     

    Glorot 초기화와 He 초기화는 딥러닝 모델에서 가중치를 초기화하는 데 사용되는 표준 초기화 기법입니다. 각각의 초기화 기법은 모델의 레이어에 따라 적합한 분산을 가진 가중치를 생성합니다.

    Glorot 초기화는 입력 뉴런 수와 출력 뉴런 수를 고려하여 가중치를 초기화합니다. 이 방법에서는 각 가중치를 $N(0, var)$ 분포에서 무작위로 선택합니다. 분산(var)은 다음과 같이 설정됩니다.

    $$var = \frac{2}{(n_{in} + n_{out})}$$

    여기서 $n_{in}$은 해당 가중치와 연결된 입력 뉴런의 수이고, $n_{out}$은 해당 가중치와 연결된 출력 뉴런의 수입니다. Glorot 초기화는 입력과 출력 뉴런 수가 같은 경우에도 적용할 수 있습니다.

    He 초기화는 ReLU(Rectified Linear Unit) 활성화 함수와 함께 사용됩니다. ReLU 함수는 음수 입력을 0으로 처리하고 양수 입력을 그대로 전달합니다. 이러한 특성으로 인해 ReLU 함수는 학습 과정에서 뉴런의 활성화를 유지하는 데 도움이 됩니다.

    He 초기화는 Glorot 초기화와 비슷한 방식으로 가중치를 초기화합니다. 그러나 He 초기화는 출력 뉴런 수를 고려하지 않고 입력 뉴런 수만을 고려합니다. 이 방법에서는 각 가중치를 $N(0, var)$ 분포에서 무작위로 선택합니다. 분산(var)은 다음과 같이 설정됩니다.

    $$var = \frac{2}{n_{in}}$$

    따라서 He 초기화는 ReLU 함수와 함께 사용할 때 더 나은 성능을 제공합니다.

    이러한 초기화 방법은 모델의 학습 속도와 정확도에 영향을 미치기 때문에 딥러닝 모델에서 매우 중요합니다. 따라서 이러한 초기화 기법을 올바르게 사용하는 것이 좋은 모델을 구축하는 데 필수적입니다.

    반응형
Designed by Tistory.