Tensor의 norm(노름)과 유사도

seung·2024년 8월 6일

pytorch

목록 보기
6/10

우리가 지난 게시글에서 배웠듯이 1-D tensor의 구조, 2-D tensor의 구조, 텐서의 크기를 알 수 있는 shape,size()를 배웠었다. (이때 1-D tensor의 크기는 요소의 개수를 의미한다.)

여기서 우리가 짚고 넘어가야할 문제가 있다.

두 tensor를 비교할 때 한 tensor의 요소의 개수가 많다고 해서 크기가 더 크다고 판단할 수 있을까?
안된다!!!
[1,2,3]인 텐서와 [1,2]인 텐서를 애초에 차원이 달라서 비교할 수가 없다.

그렇다면 어떻게 비교해야 할까?

노름(norm)

1-D tensor의 노름은 벡터가 원점에서 얼마나 떨어져 있는지를 알려준다.(벡터의 길이)
1-D tensor의 노름에는 L1,L2,L infinite 등 여러가지 유형이 있다.

  • L1노름
    1차원 tensor의 요소들의 절댓값의 합으로 정의된다.('맨해튼 노름'이라고도 한다.)
    a=torch.tensor([1,2,3])
    torch.norm(a,p=1)

  • L2노름
    1차원 tensor의 요소들의 제곱합의 제곱근으로 정의된다.('유클리드 노름'이라고도 한다.)
    torch.norm(a,p=2)

  • L-infinite 노름
    1차원 tensor의 요소들의 절댓값 중 최대값으로 정의된다.
    torch.norm(a,p=float('inf')) or torch.max(a.abs())

    노름의 기하하적 의미
    이 3가지 norm은 성능평가를 할때 사용되기 때문에 잘 알아두는 것이 좋다!

유사도(similarity)

두 1차원 tensor가 얼마나 유사한지를 측정한 값
이러한 유사도는 군집화 알고리즘에서 중요한 기준으로 사용된다.

  • 맨해튼 유사도
    두 1차원 tensor사이의 맨헤튼 거리를 역수로 변환하여 계산한 값
    그래서 거리가 짧을수록 유사도가 증가한다.(유사도가 1의 가까울수록 매우 유사한 것이다.)
    분모가 0이 되는 것을 방지하기 위해 분모에 1을 같이 더해준다.
    manhattan=torch.norm(a-b,p=1) ---> 1/(1+manhattan)

  • 유클리드 유사도
    두 1차원 tensor사이의 유클리드 거리를 역수로 변환하여 계산한 값
    맨해튼과 같이 1에 가까울수록 유사하다.
    euclidean=torch.norm(a-b,p=2) ---> 1/(1+euclidean)

  • 코사인 유사도(활용도가 높다)
    두 1차원 tensor사의 각도를 계산한 값, 코사인 값이 1에 가까울 수록 유사하다는 것을 의미한다.
    cosine의 값은 내적을 통해 구할 수 있다.
    내적을 구하는 방법
    1) 두 1차원 tensor의 각 요소를 곱해서 더하기
    torch.dot(b,c)
    2) 두 1차원 tensor의 길이를 곱하는 법
    이 방법을 통해 우리는 cosine 값을 알아낼 수 있다.
    cosine=torch.dot(b,c)/(torch.norm(b,p=2)*torch.norm(c,p=2))

    왜 길이와 각도가 연관이 있는 것일까? 
    우리가 그냥 단순히 x와 y의 유클리드 거리를 구해서 곱해주면 내적의 값이 나오는 것이 아니다.
    왜냐하면 그 두 벡터의 사이 각을 고려해주지 않았기 때문이다. 
    그래서 그 값까지 고려하면 아래와 같은 식을 얻을 수 있고 cosine으로 정리하면 코사인 값을 알 수 있다.

cosine=torch.dot(b,c)/(torch.norm(b,p=2)*torch.norm(c,p=2))

0개의 댓글