서론
신경망에 입력되는 observation에는 Joint Position, Joint Velocity, Linear Velocity, Angular Velocity, Projected Gravity, Previous Action 등 서로 다른 종류의 데이터가 존재한다.
예를 들어 어떤 observation은 대부분 \([-1 \sim 1]\) 사이에 존재하는 반면, Joint Velocity와 같은 observation은 특정 구간에서 \([10 \sim 20]\) 이상의 값을 가질 수도 있다.
이러한 scale 차이가 지나치게 크면 신경망의 첫 번째 layer에 입력되는 값의 크기 역시 크게 달라진다.
따라서 일부 observation의 numerical magnitude가 다른 observation에 비해 지나치게 크면 초기 학습 과정에서 특정 입력이 상대적으로 큰 영향을 줄 가능성이 있고 활성화 함수(sigmoid, tanh)를 통과 하면 발산하여 학습을 방해할 수 있다.
여기서 다루는 RMS와 RMS Ratio는
신경망에 들어가는 observation들의 numerical magnitude를 비교하기 위한 진단 지표
이며 우리의 목표는 특정 observation만 다른 observation보다 지나치게 큰 numerical scale을 가지는 것을 방지하는 것이다.
본론
기존 표준화( \(\mu\) 차감 방식)의 물리적 한계
일반적인 정규화 방식 \(x_{\text{norm}}=\frac{x-\mu}{\sigma}\) 는 로봇 학습에 그대로 적용하기 부적합하다.
물리적 의미 훼손
속도 데이터에서 0 m/s는 '정지 상태'라는 절대적인 물리적 의미를 가집니다. 부호(+/-) 역시 명확한 이동 방향의 의미를 가진다. 만약 평균 6 m/s를 빼버리면, 정지 상태(0)가 -6으로 변환되어 수치가 가지는 본래의 물리적 의미가 무너진다.
좌우 대칭(Mirror Symmetry) 구조 파괴
사족보행 로봇은 좌우 관절 위치를 교환하고 부호를 반전시키는 대칭 연산을 통해 데이터를 증강하고 일관성을 유지합니다. 각 채널별로 고유한 평균값을 빼버리면 0을 기준으로 성립하던 단순한 대칭 연산이 복잡해지고 대칭성이 깨진다.
이에 우리는 평균을 제거하지 않고 원점(0)을 유지한 상태에서, 필요한 채널의 값 크기(Scale)만 조절해야 한다.
RMS
평균을 빼지 않으면서 값의 부호 변화를 막고 신경망에 전달되는 'numerical magnitude 크기'를 측정하기 위해 RMS(Root Mean Square)를 사용한다.
특징은 평균을 먼저 제거하지 않고 제곱을 함으로 써 음수의해 값이 상쇄되지 않아 크기 또한 그대로 반영된다.
그리고 그 크기 들에 대하여 평균을 구한다. 마지막으로 제곱을 했으니 원래 scale로 돌려놓기 위해 루트를 취하여 계산된다.
예를 들어 다음 데이터가 있다고 하자.
RMS를 계산하면 2가 나오므로 실제 입력의 크기를 제대로 표현할 수 있다.
따라서 RMS는 “이 observation이 실제로 신경망에 어느 정도 크기의 값을 계속 입력하고 있는가?”
를 나타내는 지표로 사용한다.
Example
x, y, z 축을 가지는 각속도(Angular Velocity)의 RMS 구해보자.
4번의 time step 동안 로봇의 각속도 데이터가 아래와 같이 수집되었다고 가정해 보자.
1. 제곱합 계산: 음수 부호가 상쇄되지 않도록 모든 요소를 제곱하여 더한다.
- x축 제곱합: \(1^2 + (-1)^2 + 1^2 + (-1)^2 = 4\)
- y축 제곱합: \(2^2 + 2^2 + (-2)^2 + (-2)^2 = 16\)
- z축 제곱합: \(0^2 + 0^2 + 0^2 + 0^2 = 0\)
- 평균 및 제곱근 취하기: 전체 데이터 개수(12개)로 나누어 평균을 구한 뒤 루트를 씌운다.
이처럼 \(x, y, z\)차원이 분리되어 있고 양수/음수가 교차하더라도, 1.29라는 RMS 수치를 통해 신경망이 받는 각속도 데이터의 magnitude를 표현할 수 있다.
그리고 x, y축을 가지는 command velocity의 RMS를 구했더니 0.3가 나왔고 또 어떤 feature의 RMS가 0.5이 나왔다고 해보자.
그럼 여기서 0.3가 numerical scale을 갖는지 0.5 또는 1.29가 더 큰 스케일을 가지는지 알기가 어렵다. 따라서 기준이 필요하다.
RMS Ratio
개별 그룹의 RMS 절대값만으로는 해당 수치가 다른 데이터에 비해 얼마나 큰지 직관적으로 판단할 수 없다. 이를 위해 RMS Ratio를 사용한다.
왜 Baseline으로 평균이 아닌 '중앙값'을 사용하는가?
우리의 목적은 다른 관측치들에 비해 numerical scale이 큰 입력을 찾아내는 것이다. 만약 Joint Velocity처럼 RMS가 매우 큰 데이터가 섞여 있는 상태에서 전체 RMS의 평균을 기준값으로 삼게 되면, 이 극단적으로 큰 값들이 기준 평균치 자체를 위로 끌어올려 버린다.
반면 '중앙값(Median)'은 일부 극단적인 값의 영향을 상대적으로 덜 받으므로, 데이터들의 전반적인 크기를 대표하는 기준으로 적합하다.
Example
위에서 구한 angular velocity 각속도가 입력 데이터들에 대하여 상대적으로 얼마나 큰 지를 알기 위해
\(\text{Target RMS} = 1.29\) 로 설정한다. \(\text{Baseline RMS}\)를 선택하기 위해서 위에서 구했던 RMS값들을 정렬하고 중앙값을 뽑는다. 0.3, 0.5, 1.29의 중앙값은 0.5가 된다.
RMS Ratio를 계산해보면
가 된다.
해석을 해보면 각속도 데이터는 현재 다른 일반적인 관측치들보다 약 2.58배 큰 스케일을 가지고 있으므로, 스케일 팩터를 곱해 크기를 줄여줄 필요가 있다.
| Ratio 범위 | 의미 |
| \(\text{RMS Ratio} \approx 1.0\) | 다른 관측치들과의 크기가 비슷 |
| \(\text{RMS Ratio} > 1.0\) | 다른 관측치들과의 크기가 큼 |
| \(\text{RMS Ratio} < 1.0\) | 다른 관측치들과의 크기가 작음 |
정규화가 필요하지 않은 경우
모든 입력을 반드시 정규화할 필요는 없다.
예를 들어 Projected Gravity가 이미 대략 -1에서 1 정도의 범위에 존재한다면 신경망 입력으로 충분히 적절한 numerical scale이라고 볼 수 있다. 그러므로 이미 적절한 크기를 가지고 있는 입력까지 억지로 정규화할 필요는 없다.
go1의 사족보행을 학습시키기 위해서는 t 시점의 action을 결정하기 위해 t-1 시점의 Previous Action을 입력으로 사용한다. Previous Action은 바로 이전 시점에 동일한 policy가 출력한 값이다.
따라서 현재 policy가 출력하는 action과 Previous Action을 동일한 action coordinate(좌표)와 numerical scale로 유지하는 것이 구조적으로 자연스럽다.
또한 스케일링을 통해 Previous Action을 조절한다면 Current Action과의 출력 차이가 크게 변하지 않도록 학습해야 하는데 커져 모델의 입장에서는 학습하기 어려울 것이다.
따라서 각 observation의 분포와 물리적 의미를 먼저 확인하고,
- 다른 입력보다 numerical scale이 지나치게 큰 경우에는 scaling을 적용하고,
- 이미 적절한 크기를 가지거나 원래 값 자체의 의미를 유지하는 것이 중요한 경우에는 그대로 사용하는 방식
으로 선택적으로 정규화를 해야한다.
Comment