ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컨볼루션(합성 곱) 에 대한 직관적 이해
    Math♾️/Fourier Analysis 2023. 5. 15. 15:04

     
    합성곱이라고도 불리는 'Convolution'은 소리 신호 필터링, 영상 처리등과 같이  입력과 이에 대한 출력이 존재하는 경우
    입력을 목적에 따라 가공해서 원하는 출력을 얻기 위해서 사용하는 연산이다. 
     
    다양한 분야에서 사용되는 만큼 자주 만나게 되는 연산이지만 수식의 전개로만 이해하기에는 너무 추상적이기 때문에 
    그 분야에서 적용되는 연산 방법을 외우고 이를 그냥 활용하기만 하는 경우가 있다. 
     
     이 합성곱이 일반적으로는 어떠한 의미를 갖고 있는지를 살펴보는 과정을 통해  
    합성곱이 입력과 출력사이에서 어떠한 역할을 하는지에 대한 직관을 얻을 수 있도록 해보았다. 
     
    추상적인 것을 이해하는 방법 중 하나는 알고자 하는 것에 대한 가장 단순한 예를 생각해 보고
    이를 기초로 점점 다양한 상황에 적용될 수 있도록 일반화하는 과정을 거치는 것이다. 
     
    다음은 컨볼루션에 대한 식으로 어떠한 요소들이 조합되어 있는지 하나씩 뜯어보자.
     

     
     

    • f, g는 함수로서 각각 입력에 대한 출력을 정의하며 f, g의 관계를 통하여 현상에 대한 표현이 가능하다. 두 함수는 곱연산을 사용하는데 이때 함수 간의 곱연산은 각 함수가 각각 서로 다른 함수와 갖는 관계를 나타내므로 f와  g사이의 갖는 변화에 대한 유사성의 정도가 클수록 f의 출력이 g의 입력으로 주어졌을 때 변화의 방향이 뚜렷해진다. 

     

    • t는 시간으로서 함수의 입력과 출력을 어떠한 것을 기준으로 하여 표현할지를 나타낸다. 일상생활에서 접할 수 있는 현상들은 시간에 따라 나타나는 변화에 대하여 관심이 있기 때문에 여기서는 시간 t를 기준으로 하여 입력과 출력을 나타내었다. 만약에 어떠한 현상을 시간이 아닌 공간상의 위치에 따른 변화에 관심이 있으면 해당 파라미터를 공간을 표현하는 변수로도 나타낼 수 있다.

     

    • f와 g의 관계를 통해 나온 최종적인 출력은 시간 t의 각 지점에 대하여 표현된다. 이때 우리는 딱 특정 시점에 대한 출력이 아니라 현상이 나타나는 동안 발생하는 출력들에 대하여 관심이 있기 때문에 적분을 통하여 각 시점에 나타나는 출력들을 쌓아서 특정 기간 동안 발생하는 출력들을 합하여 관찰할 수 있다. 

     

    • $\tau$는 f와 g 사이에서 출력과 입력을 이어주는 매게 변수의 역할을 한다. 

     

    식을 구성하는 요소들이 갖고 있는 의미를 대략적으로 살펴봤으므로
    이제 간단한 예를 통하여 전체 컨볼루션 식이 어떠한 의미를 갖는지에 대하여 살펴보자.
     
     

     

     
    불을 피울 때 사용하는 성냥을 예로 들어보자. 
    성냥을 피우면 불꽃이 이는 동시에 주위에 연기가 발생한다는 현상을 관찰하였다.
     
    이러한 현상을 최대한 단순화하기 위해 위와 같이 이산적인 그래프로 나타내보았다.
     
    첫 번째 Smoke 그래프는 성냥 하나당 발생하는 연기량을 나타낸다.
    0초에 성냥에 불이 붙였을 때 5의 연기가 발생하고 시간이 경과함에 따라 연기의 발생량이 1초마다 1씩 떨어진다고 하였다.
    즉 0초에는 5만큼의 연기가 그리고 1초 뒤에는 4만큼의 연기가 또 1초 뒤에는 3만큼의 연기가 발생한다.
     
    두 번째 Match 그래프는 시간에 따라 불을 붙인 성냥의 개수를 나타낸다. 
    위의 그래프에서는 0초에는 3개의 성냥을 2초에는 1개의 성냥을 4초에는 2개의 성냥에 불을 붙였다.
     
    이때 연기(Smoke)와 성냥(Match) 간의 관계는 완전 선형적이어서 성냥을 1개 피우면 5만큼의 연기가 발생하고
    성냥 2개를 피우면 10만큼의 연기가 성냥 3개를 피우면 15만큼의 연기가 발생한다고 하자. 
     
    여기까지 상황을 정리해 보면
    성냥에 불을 붙이면 연기가 발생한다는 현상을 관측했고 
    불을 붙인 이후 성냥의 연기가 시간에 따라 줄어든다는 시간에 대한 연기의 변화를 알았으며(g)
    시간에 따라 불을 붙이는 성냥의 개수를 조절하면서 시간에 대한 성냥개수의 변화를 정할 수 있었다.(f)
    마지막으로 성냥과 연기사이의 관계가 선형적임을 가정함으로써 이 둘 함수(f, g) 사이의 관계를 정의하였다.(f*g)
     
    따라서 시간에 따라 불을 붙인 성냥의 개수를 달리하며 각 시점에서의 연기의 양을 컨볼루션을 통해서 나타낼 수 있다.
    t -> f(t) -> g(t) * f(t)
     

     
    0초, 2초, 4초에서 성냥 3개, 1개, 2개를 피웠을 때 발생한 연기의 변화를 각각의 그래프로 나타낸 것이다. 
    즉 성냥 개수에 따라 입력을 달리 했을 때 이로 인해 발생한 연기의 양을 출력으로 나타내었다.
    여기서 눈여겨야 봐야 할 점은 특정 시점에 성냥에 불을 붙여 연기가 발생했을 때 해당 시점에 발생한 총연기의 양에는 지금 성냥뿐만 아니라
    이전에 붙인 성냥에서 발생한 연기의 양도 포함된다는 점이다. (입력과 출력의 시점사이에 차이가 존재한다.)
     
    위의 예에서 각 시점에 연기의 양이 시간에 따라 어떻게 변화하는지 계산해 보자. 
     
     

     
     

    • 1초, 총 연기량 : 12
      • 0초에 피운 성냥 3개에 대한 연기 : 12
    • 2초, 총 연기량 : 9 + 5 = 14
      • 0초에 피운 성냥 3개에 대한 연기 : 9
      • 2초에 피운 성냥 1개에 대한 연기 : 5
    • 4초, 총 연기량 : 3 + 3 + 10 = 16
      • 0초에 피운 성냥 3개에 대한 연기 : 3
      • 2초에 피운 성냥 1개에 대한 연기 :  3
      • 4초에 피운 성냥 2개에 대한 연기 : 10
    • 8초, 총 연기량 : 2
      • 4초에 피운 성냥 2개에 대한 연기 : 2

     
    입력이 한 번만 주어질 때는 함수 하나만 가지고도 입력에 대한 출력량의 변화를 시간 축상에 나타낼 수 있지만 
    시간에 따라 입력이 변화하며 연속적으로 주어지는 경우에는 각 시점에서의 출력이 달라지기 때문에
    전체 출력량을 계산하기 위해서는 
    위와 같이 각 시점에서 입력에 대한 출력을 나타낸 뒤 이를 원하는 시간 범위에 대하여 해당 출력들을 모든 더하는 작업이 필요하다.
     
    여러 현상 중에서는 이를 촉발시킨 원인이 단 한 시점에 주어지는 경우도 있지만
    위와 같이 현상의 원인들이 여러 시점에 걸쳐 변화하며 주어질 때가 많다. 
    이러한 현상을 분석하기 위해서는 현상을 이루는 원인들을 쪼갠 뒤 각각의 원인에 대한 결과들을 구하고
    이 구한 결과들을 다시 합하는 과정을 통해 전체를 구성하는 과정을 거쳐야 한다. 
     
    정리하면 컨볼루션이 사용되는 상황과 이때의 방법은 다음과 같다.
     

    1. 출력의 결과로써 벌어지는 현상이 시간에 따라 나타나며 이 현상에 대해 관계를 갖고 있는 입력을 알고 있다. 
    2. 이러한 입력이 단발성이 아닌 지속적으로 변화하며 주어진다. 
    3. 입력과 출력이 갖는 관계(함수 간의 곱)를 통해서 각 시점에서의 입력에 대한 출력을 구한다. 
    4. 이렇게 구한 출력들을 원하는 시간 범위에 대해 더하는 과정(적분)을 통해서 전체 출력량을 계산한다. 

     
    쪼개서 분석한다음에 다시 합한다.
     
     
    이산적인 경우를 통해 컨볼루션이 갖는 의미에 대해서 살펴보았으니 다시 이를 수식에 맞게 진화시켜 보자.
     
    우리의 성냥 예의 경우에는 성냥의 연기양을 시간에 대해 이산적으로 표현했지만 실제로는 시간에 따라 서서히 감소하는 연속함수의 형태를 띨 것이며 기울기(변화량)가 일정하여 직선 형태를 갖기보다는  시간에 따른 연기량의 변화량도 달라져 곡선형태의 함수를 가질 것이다. 
     
    또한 우리는 몇 초의 간격을 두고 성냥에 불을 붙였지만 입력 또한 연속적인 형태로 주어진다고 해보자. 
    그니까 성냥에 불을 붙이는 시점 간의 간격을 무한으로 줄여서 0.0000000000...... 000001초마다
    임의의 개수에 성냥에 불을 지피는 거다.
     
     

     
    이와 같은 형태로 입력과 출력의 시간에 대한 변화가 나타나면
    처음 예와 같이 단순히 각 시점에서의 입력에 대한 모든 출력 그래프를
    나타난 뒤 원하는 시점의 출력을 단순히 모두 더하는 방식을 취하기가 어렵다.
     
    리만합의 연속 개념을 도입해서 적분을 도출해 내는 것처럼
    우리의 이산적인 값들이 연속적인 값으로 확장했기 때문에 우리도 원하는 시간 범위에 대하여 
    적분을 활용해 전체 출력의 값을 구할 수 있다. 
     
    여기서 더해 성냥과 연기 양의 관계를 일반화하면  
    처음 예에서는 성냥과 연기의 양 관계가 완전 선형의 관계를 가정하여
    단순히 곱으로 성냥 개수에 따른 연기량의 계산하고 이를 출력 그래프로 나타낼 수 있었다. 
    하지만 실제로는 입력과 출력사이의 관계가 존재해도 완전한 선형성을 띄는 경우는 거의 없다. 

     

    함수간의 내적에 대하여 생각하기

    벡터에서 내적을 이용하면 각 백터가 상호간에 얼마나 닮았는지를 나타낸다. 벡터 $\vec{u}$ 와 $\vec{v}$ 여러 기저벡터가 합쳐져서 해당 방향을 가리키고 있는 것이라고 볼 수 있다. 따라서 기저벡

    people-analysis.tistory.com

     
    함수 간의 내적(함수를 구성하는 요소들 간의 곱) f*g는 각 함수 간의 관계를 나타낸다. 
    즉 f가 g에 영향을 끼치는 정도 또는 g가 f에 영향을 끼치는 정도를 알려준다.
    따라서 우리가 계산하고자 하는 입력함수 f와 출력함수 g를 곱을 이용해서 나타내면 둘 간의 관계를 통해
    각 시점에서의 출력의 양을 계산할 수 있다.
     
    입력과 출력을 연속으로 확장했을 때 적분과 함수 간의 곱을 통해서 최종 출력을 구할 수 있음을 알았다. 
    근데 이산적인 경우에는 각 입력에 대한 출력을 표현하기가 어렵지 않았다.
    하지만 연속의 경우에는 일단 입력이 연속되어 있기 때문에 각 입력에 따른 출력을 표현하기가 상당히 어렵다. 
    그러면 어떻게 하면 연속시간에 대해 좀 더 입력과 출력을 효과적으로 표현할 수 있을까?
     
    이때 등장하는 것이 반전전이이다.
     
    이번에도 단순화하여 표현하기 이해서 처음 보았던 성냥-연기 그래프를 가지고 와보자.
    시간에 대해 피운 성냥 개수의 그래프를 y축에 대하여 뒤집어 보았다. 
     

     
    여기서 전이를 시키면서 변화하는 입력인 성냥 개수 그래프를 연기량 그래프에 겹쳐보자. 
     

    0초일 때는 
    0초일 때 피운 성냥 3개짜리가 입력으로 들어가며
    성냥을 막 피웠을 때 즉 0초일 때는 성냥 1개당 출력이 5씩이다. 
    따라서 이둘의 곱인 3*5=15가 총 연기양으로 나타난다. 
     
    자 여기서 1초가 흐르면

    1초인 시점에서 
    아직 입력 그래프에서 진입한 추가적인 입력은 없으며 0초 때 피운 성냥 3개만이 여전히 전체 출력을 차지한다.
    성냥을 피우고나서 1초가 지난 시점의 연기양은 성냥 1개당 4이다. 
    따라서 성냥3개 * 4 = 12가 2초일 때의 총 연기량이 된다.
     
    1초가 더 흘러서 

    2초가 되었을 때 
    1개짜리 성냥이 추가로 진입했다. 
    이 시점에 1개짜리 성냥은 지금 막 켜진 것이며
    막켜진 성냥의 연기량은 1개당 5이다. 
    따라서 1개짜리 성냥에 대한 연기량은 5이며
     
    0초일 때 피운 성냥 3개짜리는 이제 켜진지 2초가 되었으므로 
    성냥 하나당 연기량이 3이 되었다.
    따라서  3개짜리 성냥에 대한 연기량은 9이다.
     
    결국 2초일 때 총 연기량은 14가 된다.
     
     

     

    4초가 되어 4초에 킨 2개의 성냥이 진입하였을 때 
    해당 성냥은 방금 켜졌으므로 성냥 하나당 연기량 5로
    총 5*2=10
     
    2초에 킨 성냥 1개는 이제 켜진지 2초가 되었으므로 
    하나당 연기량은 3으로
    총 연기량은 3*1=3
     
    0초에 킨 성냥 3개는 이제 켜진지 4초가 되었으므로 
    하나당 연기량은 1이며 
    총 1*3=3
     
    총 연기량은 10+3+3=16이 된다. 
     
    계산된 총 연기량을 보면 위에서 계산한 것과 동일한 값을 얻음을 확인할 수 있다.
     
     
    이 방법을 연속 그래프에 적용한 것이 우리가 합성곱에서 흔히 볼 수 있었던 움직이는 그래프의 모습이다. 

    컨볼루션은 결국 변화하는 입력이 연속적으로 주어졌을 때
    각 시점의 입력에 대한 출력은 해당 입력 시점부터 시간에 흐름에 따라서 변화하며 나타나게 되므로 
    특정시점의 총출력량은 해당 시점의 입력에 대한 출력뿐만 아니라 이전 시점의 입력들에 대한 출력들이 중첩해서 나타나게 된다.
    따라서 이를 계산하기 위해서 입력과 출력 간의 관계를 통해서 전체 출력을 시간에 따라 표현할 수 있어야 하는데 이를 위해 사용하는 연산이 합성곱(컨볼루션)이다.
     
    이를 자연스럽게 발생하는 현상을 기술하는 데 사용할 수도 있지만 더 나아가 이렇게 연속되는 신호(시간에 대해연속/ 공간에 대해 연속)들이 입력(f)으로 주어졌을 때 우리가 적절한 함수 g를 선택하여 이와 컨볼루션 하게 되면 원하는 형태의 연속되는 신호를 출력으로 얻을 수 있다. 
     
    예를 들어 소리의 경우에는 처음 소리를 입력 f로 한 뒤 원하는 영역 대의 주파수를 뽑는 g를 컨볼루션 하여 필터 역할을 할 수 있으며
    이미지의 경우에는 시간 대신 일정한 범위의 공간에 대해서 값들을 표현하고 소스 이미지를 입력 f로 한뒤 해당 이미지에서 원하는 패턴을 뽑는 g를 컨볼루션 하여 압축을 하거나 또는 유사도를 측정하는 g와 컨볼루션 하여 이미지 분류에도 이용할 수 있다.
     
    이것들 뿐만 아니라 아주 다양한 상황에서 입력과 출력간의 관계를 이용하여 입력을 원하는 목적에 따라 가공할 때 사용한다. 
     

     
     
     

    댓글

Designed by Tistory.