전략(Strategy) 패턴 정의

알고리즘 구현 부분을 캡슐화하여 알고리즘의 변경과 수정에 용이한 패턴을 의미한다. 서브 클래스들의 핵심 알고리즘 구현 부분을 별도로 캡슐화하여 베이스 클래스와 서브 클래스 간의 상속으로 인한 결합성을 낮춘다.    

 

핵심 : 베이스 클래스는 핵심 알고리즘의 호출 부분을 인터페이스로 저장하고 호출만수행하고, 핵심 알고리즘의 구현 부분을 캡슐화하여 코딩한다.

필요한 상황

1. 베이스 클래스를 상속 받은 서브 클래스들이 베이스 클래스의 함수를 호출할 때 각기 다른 기능을 수행하는 구조가 필요할 때 (다형성을 이용할 경우)

2. 서브 클래스가 베이스 클래스의 함수를 오버라이딩하여 서브 클래스에서 함수를 재작성 해야하는 경우 (매번 서브 클래스에서 함수를 오버라이딩하여 작성할 경우)

3. 향후 베이스 클래스를 상속받은 서브 클래스가 증가할 것으로 예상 될 경우 (잠재적 기능 추가 요소인 경우)

Class 다이어그램

요구 사항 1. RPG 게임 환경에서 검사, 수도승, 궁사 직업군이 있다.

요구 사항 2. 각 직업군은 서로 다른 공격과 방어 행동을 가진다.

요구 사항 3. 각 직업군은 무기 변경이 가능하다.

코드

 

 

 

1. 사람 Class (베이스 클래스)

public class Human
{
	protected IAttackBehavior attackBehavior { get; set; }
	protected IDefenceBehavior defenceBehavior { get; set; }

	public void Attack()
	{
		attackBehavior.attack();
	}

	public void Defence()
	{
		defenceBehavior.defence();
	}

	public void SetAttackMode(IAttackBehavior ia)
	{
		this.attackBehavior = ia;
	}

	public void SetDefenceMode(IDefenceBehavior id)
	{
		this.defenceBehavior = id;
	}
}

2. 행동 interface 

public interface IDefenceBehavior
{
	void defence();
}
    
public interface IAttackBehavior
{
	void attack();
}

3. 알고리즘 구현 Class 부분 Behavior interface를 상속받음

public class AttackWithBow : IAttackBehavior
{
	public void attack()
	{
		Console.WriteLine("Attack with Bow");
	}
}

public class AttackWithSword : IAttackBehavior
{
	public void attack()
	{
		Console.WriteLine("Attack with Sword");
	}
}

public class AttackWithGlobe : IAttackBehavior
{
	public void attack()
	{
		Console.WriteLine("Attack with Globe");
	}
}

public class DefenceWithBow : IDefenceBehavior
{
	public void defence()
	{
		Console.WriteLine("Defence with Bow");
	}
}

public class DefenceWithSword : IDefenceBehavior
{
	public void defence()
	{
		Console.WriteLine("Defence with Sword");
	}
}

public class DefenceWithGlobe : IDefenceBehavior
{
	public void defence()
	{
		Console.WriteLine("Defence with Globe");
	}
}

4. 전사, 궁사, 수도승 클래스 (서브 클래스)

public class Archer : Human
{
	public Archer()
	{
		this.attackBehavior = new AttackWithBow();
		this.defenceBehavior = new DefenceWithBow();
	}
}

public class SwordMaster : Human
{
	public SwordMaster()
	{
		this.attackBehavior = new AttackWithSword();
		this.defenceBehavior = new DefenceWithSword();
	}
}

public class Monk : Human
{
	public Monk()
	{
		this.attackBehavior = new AttackWithGlobe();
		this.defenceBehavior = new DefenceWithGlobe();
	}
}

5. Main 코드

Attack(new Archer());
Attack(new SwordMaster());
Attack(new Monk());
var instance = new Monk();
instance.SetAttackMode(new AttackWithBow());
Attack(instance);


void Attack(Human human)
{
    human.Attack();
}

void Defence(Human human)
{
    human.Defence();
}

출력 결과

코드 설명

1. 사람 Class (베이스 클래스)

   - 모든 서브 클래스들의 함수와 알고리즘 구현 인터페이스를 담고 있다.

   - Class의 사용자는 서브 클래스들의 특징을 파악할 필요 없고 베이스 클래스의 함수와 특성값만 알면 된다. 

2. 행동 interface

   - 알고리즘 인터페이스이다.

   - 베이스 클래스는 알고리즘 인터페이스 변수를 저장하고, 필요에 따라 인터페이스를 상속받은 다른 구현 알고리즘을 바꿔치기 사용하면 된다.

3. 알고리즘 구현 Class 부분 Behavior interface를 상속받음

   - 알고리즘 인터페이스를 상속받은 Class이다.

   - 실제 알고리즘의 구현이 들어가는 부분이다.

4. 전사, 궁사, 수도승 클래스 (서브 클래스)

   - 생성자 부분에서 행동 interface 규격을 맞추는 Class로 정의하여 베이스 클래스의 행동 interface에 할당하면 된다.

5. Main 코드

   - Main에 정의한 함수는 사람 class의 함수를 호출하지만 각 서브 클래스들로 업캐스팅하여 기입하고 각 서브 클래스들은 각기 다른 행동 interface로 구성했기 때문에 서로 다른 출력 결과를 보여준다.

   - 출력 결과 모든 요구사항을 충족함을 볼 수 있다.

설명 보충을 위한 그림 자료

필요에 따라 추가 설명

1. 베이스 클래스를 상속받아 서브 클래스에서 재사용하는 경우 고려하면 좋다.

2. 상속구조에 의한 베이스 클래스와 서브 클래스 간의 코드 변경에 의한 의존성이 줄어든다.

3. 단 interface라는 추상화 구조가 필요하다.

4. 알고리즘을 사용하는 Class는 interface형 변수를 담고 있다가 필요시 interface에서 정의한 함수를 호출하는 방법이다.

 

정리 및 결론

1. 전략 패턴의 핵심은 베이스 클래스가 특정 interface를 변수로 저장하고 있다가 특정 interface를 상속받은 구현 알고리즘 Class를 변수처럼 사용하는 것

2. 전략 패턴은 서브 클래스에서 베이스 클래스에 구성되어 있는 특정 interface를 원하는 구현 알고리즘으로 할당시킨다.

3. 베이스 클래스를 이용하는 코드(Main 부분)는 베이스 클래스의 함수만 호출해도 다양한 구현 알고리즘을 구성할 수 있다.

4. 객체지향적 사고 팁

    - 변하는 부분은 캡슐화한다. (추가 및 변경이 용이하도록 하는 것)

    - 상속보다는 구성을 이용하면 결합성을 낮출 수 있다. (베이스 클래스가 특정 interface를 변수로 저장하는 것)

    - 직접 구현보다는 interface를 상속받은 구현 Class로 나눠 변수처럼 사용한다.

'Program > SW Design Patterns' 카테고리의 다른 글

CH5 데코레이터 패턴  (1) 2023.03.05
CH4 팩토리 패턴  (0) 2023.03.04
CH3 옵저버 패턴  (0) 2023.03.03
CH2 싱글턴 패턴  (0) 2023.03.02
개요  (0) 2023.03.01

본 카테고리는 SW의 객체지향 접근을 기반으로 하는 SW 디자인 패턴을 다루는 카테고리이다.
주요 목적은 주어지는 사례에 따라 최적의 디자인 패턴을 선택하고 구현까지 할 수 있는 것을 목표로 한다. 
다룰 디자인 패턴과 글의 구성, 개발환경은 아래와 같다.
 

디자인 패턴 목차

1. 전략 패턴
2. 싱글턴 패턴
3. 옵저버 패턴
4. 팩토리 패턴
5. 데코레이터 패턴
6. 커맨드 패턴
7. 어댑터&퍼사드 패턴
8. 스테이트 패턴
9. MVC, MVVM 패턴
 

챕터 구성

1. 패턴 정의
2. 필요한 상황
3. Class 다이어그램
4. 코드
5. 코드 설명
6. 설명 보충을 위한 그림 자료
7. 필요에 따라 추가 설명
8. 정리 및 결론
 

개발 환경

1. Language : C#
2. OS : Windows 11
3. IDE : Visual studio 2019
 

작성 기간

2023-03-02 ~ 2023-03-XX (X일)
 
마지막으로 리챠드 :)

2023년 03월 01일 리챠드

 
 
 
 
 
 

'Program > SW Design Patterns' 카테고리의 다른 글

CH5 데코레이터 패턴  (1) 2023.03.05
CH4 팩토리 패턴  (0) 2023.03.04
CH3 옵저버 패턴  (0) 2023.03.03
CH2 싱글턴 패턴  (0) 2023.03.02
CH1 전략 패턴  (0) 2023.03.02

AI의 종류

지도학습 : DNN, CNN, RNN, LSTM  

비지도학습 : Autoencoder, GAN, VAE, Clustering, Novelty (of Anomaly) Detection

강화학습 : Q-Learning, DQN, DDPG 

 

AI의 전망 향후 & 어떻게 다뤄야 하는가?

사람의 일자리를 빼앗을 것이라는 주제 : 사람은 AI를 도구로써 사용해야 함. 즉 사람과 AI의 조화를 이룰 수 있는 직업을 가지거나 그렇게 의도해야 함.

 

사생활 보호 문제 문제 : 헬스 케어 종류의 데이터는 사람 개개인의 개인정보가 포함되어 있음 이를 어떻게 다룰 것인지?

정부에서 적극적으로 정책을 다뤄야 함. 

 

AI, 에너지, 생명공학 : 빌게이츠가 언급한 향후 전망 좋은 학과, 학문임

 

AI 블랙박스 : AI는 블랙박스 함수임 이를 방치하면 안 됨, 대표적인 일례는 의료업계임 이유는 AI가 판정한 결과 환자가 암이라고 했을 때 어떤 데이터에서 강하게 작용되었는지 알아야 하기 때문임. 이를 분석하기 위한 학문도 많음

 

AI 윤리 문제 : AI는 최적의 결과 또는 정해진 결과를 얻는데 능통함. 하지만 윤리 문제를 해결할 수 없음. 윤리 문제는 본질적으로 정답이 애매모호하기 때문임. 대표 일례는 트롤리 딜레마임. 

 

AI와 사람과의 연결점(인터페이스)

스마트폰은 터치 기능을 이용해 사람과 단말 간의 인터페이스를 제공함. 그럼 AI와 사람은??

음성 인식 스피커는 AI와 사람과 연결점을 제공하는 대표적인 음성 인터페이스임.

 

 

산업에서의 AI는?

 

데이터 : 다양한 산업에 AI를 적용하려 하는 노력이 많음. 하지만 몇 가지 문제가 있음.

가장 큰 문제는 데이터임. 실제로 100% 데이터 중에 10% 데이터만 쓸만한 경우도 있음. 

(데이터 편향, 오염된 데이터, 너무 오래된 데이터 등) 따라서 AI를 적용할 때에는 데이터에 신경을 매우 많이 써야 함.

AI가 안된다면 4가지 종류로 분석하는 것을 추천

1. 알고 맞춘 경우

2. 모르는데 찍어서 맞춘 경우

3. 알았는데 틀린 경우

4. 아예 모르고 틀린 경우

 

데이터를 구분한 경우 내가 어떻게 구분했는지 어떤 데이터를 썼는지 관계를 명확하게 정리해야 함!

 

데이터 수집 정책 : 데이터를 공공으로 수집하여 관리하는 정책이 있으면 좋음. 하지만 현실은 각자 개별적으로 데이터를 수집하여 적용함. 이는 매우 비효율적. 한국의 AI 발전에 기여하기 위해 집단지성 및 공리주의를 발휘하여 데이터를 모을 필요가 있음.

 

데이터 Argumentation :

GAN모델은 데이터를 생성하는 모델 중 하나임. 이는 데이터를 생성하는 모델, 데이터가 진짜인지 거짓인지 판단하는 모델을 구성하여 경쟁적으로 학습시킨 후 데이터 생성 모델을 이용하여 데이터를 만드는 방법임. 

VAE모델도 데이터를 생성하는 모델 중 하나임.

그 외 이미지의 경우는 Crop, Rotation, 노이즈 추가 등이 있음.

 

 

 

 

 

 

 

'Book > IT' 카테고리의 다른 글

개발자로 살아남기  (0) 2022.08.11
소프트 웨어 개발의 모든 것  (0) 2021.04.29

핵심 용어

자유주의적 개입주의 : 선택자의 선택 자유를 보장하는 것.

선택 설계 : 선택지를 설계 하는 것.

옵트 인, 옵트 아웃 : ??? 

모기지 설계 : ???

RECAP 제안 : 주기적으로 e-mail 로 어떤 비용이 드는지 상세히 보여주는 것.

 

책의 마지막

거울을 보며 제한적인 합리성과 자기통제 문제 그리고 사회적 영향력의 파괴적인 효과들을 이해하지 못한 채 탐욕과 부패, 악행 등을 비난하기만 한다면, 앞으로 찾아올 위기에 맞서 우리 자신을 보호할 수 없을 것이다.

 

-> 탐욕과 부패, 악행을 비난만 하지 말고 그에 맞게 우리를 보호할 수 있는 능력을 갖추자.

 

'Book > 금융 문맹 탈출' 카테고리의 다른 글

부의 추월 차선  (0) 2021.04.29
존리의 부자 습관  (0) 2021.04.29
돈의 역사  (0) 2021.04.29

Walking to the Sky

Carnegie Mellon University(CMU)에 처음 방문하면 가장 처음 눈에 띄는 조형물이다.

Walking to the Sky 옆에서 한
겨울 Jared L. Cohon University Center 가는길
Tepper School of Business 앞에서 한장!
Tepper School of Business 옆 야간 조명
겨울에 한장!
CMU 에서의 밤!

학기 시작하고 나서 밤에 숙소로 돌아가는 일이 많았다!

 

The Fence 앞에서 한장!
학교를 상징하는 체크무늬! 잘안보인다..
CMU에서 한장!
Bookstore 옆에서 한장! CMU 치면 많이 나오는 사진이다
에스코트 버스! 미국은 특성상 밤에 위험하기 때문에 에스코트 버스가 있다!
학교 앞 스벅에서 한잔! 사실 나는 파네라 브레드 커피를 많이 타먹었다 ㅎㅎ
공용 게시판이 유쾌하다 1
공용 게시판이 유쾌하다 2
Dr Mao Yisheng Statue 한장!

 

C-V2X 계열의 NR Sidelink를 다루는 논문이다. 

정리하는 이유는 5G V2X의 NR Sidelink는 어떤 채널로 구성되어 있고, 어떤 Mode로 동작하는지, Resource allocation 매커니즘을 공부하기 위함이다.

 

Physical layer structure of NR Sidelink Transmissions

A. NUMEROLOGY

1. NR Sidelink의 물리 계층 구조를 설명한다.

2. IMT-2020에서는 20Gbps 만큼의 peak data rate 기술이 충족되어야 한다함.

3. 따라서 large bandwidth 가 필요함.

4. 하지만 여러 국가의 기존 대역폭 할당 정책으로 인해 7GHz  미만에서 충분한 대역폭을 가진 사용 가능한 bandwidth를 사용하는 것은 전 세계적으로 어려운 과제임.

5. 여기서 7GHz 미만의 대역폭을 frequency range1, FR1 이라 부름.

6. 이 문제를 해결하기 위해 7GHz 이상의 대역폭을 추가로 사용함. 이는 frequency range2, FR2 이라 부름.

7. 그결과 상이한 캐리어 주파수 상의 신호 전파는 상이한 레벨의 multi path fading을 겪음.

8. 2개의 다른 캐리어 주파수를 사용하기 때문에 수신기 측에서 수행되는 퍼포먼스를 동기화 하기 위해,

낮은 캐리어 주파수(7GHz 미만, FR1)은 더 작은 SCS(sub carrier slicing)으로 구성하여 OFDM으로 배치함. -> Channel capacity 공식으로 계산하면 결국 적은 Throughput이 나오게 됨.

9. 높은 캐리어 주파수(7GHz 이상, FR2)는 더 넓은 SCS으로 구성함. 

10. 따라서 NR은 서로 다른 SCS values를 지원함.

11. 다른 방면에서 multi-path fading에 의해 야기되는 Inter-symbol interference(ISI)에 대응하기 위해 서로다른 SCS 는 cyclic prefix(CP)와 연관도 생긴다.

12. 이를 위해 CP 값이 symbolduration ratio에 따라 길이가 다르다. NR은 2가지 타입의 CP를 다룬다.

- Normal CP(NCP)

- Expended CP(EC)

13. 다음은 NR sidelink의 FR 종류에 따르는 scs, cp 비율이다.

FR1 : 15kHz, 30kHz, 60kHz 는 NCP,  60kHz는 추가로 ECP 지원

FR2 : 60kHz, 120kHz 는 NCP, 60kHZ는 추가로 ECP 지원

 

B. WAVEFORM

1. LTA-A에서 downlink, uplink, sidelink에 적용되는 파형은 각 CP-OFDM, discrete-time Fourier transfer spread OFDM, DFT-s-OFDM 이다.

2. NR에서는 downlink에 CP-OFDM이 적용되고 uplink에는 CP-OFDM, DFT-s-OFDM 모두 적용됨. 추가로 sidelink에는 CP-OFDM만 적용됨.

 

C. RESOURCE STRUCTURE IN THE TIME DOMAIN

1. NR에서는 time domain에서 resource는 아래와 같다.

- Frame : 1 frame의 길이는 10ms 이고, 10개의 subframe으로 구성되어 있다.

- Subframe : 1 subframe의 길이는 1ms 고정.

- Slot : NCP인 경우 14개의 OFDM 심볼로 구성됨. ECP인 경우 12개의 OFDM 심볼로 구성됨.

따라서 Slot의 길이는 채택된 SCS값에 따라 달라짐.

15kHz SCS -> 1ms(1 subframe과 동일).

30kHz SCS -> 0.5ms

60kHz SCS -> 0.25ms

120kHz SCS -> 0.125ms 

- Mini-slot : uplink, downlink의 latency를 단축시키기 위해 NR은 mino-slot을 추가함.

mini-slot은 실제 구성에 따라 2, 4또는 7 OFDM 심볼로 구성됨.

 

D. RESOURCE STRUCTURE IN THE FREQEUNCY DOMAIN

1. NR에서는 frequency domain에서 resource는 아래와 같다.

- Resource element(RE) : 1개의 OFDM symbol로 구성됨

- Resource block(RB) : 12개의 consecutive subcarrier로 구성됨. 즉 RB의 대역폭은 SCS값에 의존함.

- Resource grid : 동일한 SCS를 갖는 다수의 RB로 구성됨.

- Bandwidth part(BWP) : 최대 bandwidth는 400MHz임. 이는 275개의 RB로 구성됨.

하지만 대부분의 모바일 서비스에서 UE는 275개의 RB를 완전히 활용 하지않음. RB의 일부만이 에너지 절약을 위해 UE RF 동작 bandwidth를 제한하는데 사용될 수 있음.

이런 상황 대처를 위해 BWP는 연속 적인 RB들의 집합으로 구성함.

UE의 경우 최대 4개의 BWP가 carrier를 통해 구성될 수 있음. 최대 1개의 BWP가 언제든지 활성화될 수 있음.

BWP의 개념은 2개 타입의 RB로 구성될 수 있음.

- common RB(CRB) : 동일한 numerology로 구성된 RB 집합으로 가장 낮은 주파수에서 인덱싱 가능함.

- physical RB(PRB) : NR sidelink의 경우 carrier에 최대 하나의 sidelink BWP 설정 가능하며, frequency domain에서 resource scheduling을 위한 최소 단위는 10, 15, 20, 25, 50, 75, 100로 구성된 subchannel이다. 

 

 

 

 

 

 

Abstract

1. Massive MIMO는  네트워크 간 간섭(inter-network interference) 제한되는 경우 V2I와 V2V network가 radio resource pool을 공유하도록 허용하여 system capacity를 증가시킬 수 있음.

2. 하지만 네트워크 간 간섭(inter-network interference)을 control 하기 위해서는 V2I과 V2V network가 서로 채널상태정보(Channel State Information : CSI)를 서로 교환해야한다. 그리고 이는 막대한 signaling resources가 필요함.

3. 본 논문은 one-bit signaling 기반 interference management scheme을 제한하여 signaling overhead를 감소시키고 동시에 V2V network와 V2I network의 interference을 controlling하는 방법을 소개함.

 

INTRODUCTION

 

1. Vehicle to everything(V2X)는 자율주행 자동차 개발을 위한 필수 요소임.

2. 특히 3GPP Release 16에는 New Radio(NR) sidelink를 통해 Base Station(BS)의 도움없이 V2V 간의 직접통신 방식을 통해 low-latency, high-throughput, high connection density를 만족시키는 방법을 설계했음.

3. 5G NR은 improve throughput, improve coverage, 다른 user들과의 manage the interference를 하기 위해  Massive MIMO를 deploy했음.

4. Massive MIMO는 V2V network에서 V2I network로의 inter-network intereference가 제한된 경우 V2V network와 V2I network가 radio pool을 공유하도록 허용할 수 있음.

5. MIMO V2V communications는 V2V Link 들 간의 intra-network interference를 야기하고 동시에 V2I network에 inter-network interference도 발생시킴.

6. 따라서 resource sharing between the V2V and V2I network을 위해서 intra-network interference와 inter-network interference를 감소시키는 것은 매우 중요함.

 

7. Interference alignment(IA)Interference management(IM) techniques 중에 유망한 기술이다.

8. [4-7]저자는 MIMO heterogeneous network에서 mitigate the interference를 하기 위해 Interference alignment(IA) 기법을 적용하였으며, heterogeneous network간 Channel State Information(CSI)를 공유하여 precoding matrices와 decoding matrices를  제어했다.

9. [4]저자는 macro cell의 coverage 안에서 2개의 small cells에 대해 감소된 Channel State Information(CSI)를 사용하는 새로운 Interference alignment(IA) 기법을 개발했으며, 제안한 Interference alignment(IA)방식이 달성가능한 자유도를 분석했음.

10 [5,8]저자는 MIMO heterogeneous networks에 대한 Interference alignment(IA)를 향상시켰으며, 여기서 data streams의 수와 precoding matrices, decoding matrices를 제어했음.

11. 하지만 이 저자들은 transmitter와 receiver가 perfect knowledge of CSI를 알고있다고 가정했음. 그리고 data streams에 대한 동일한 전력 할당이 가정되어 최적이 아닌 시스템 성능으로 이어질 수 있음.

12. 미래의 system performance를 증가시키기 위해 [6]저자는 device-to-device (D2D) communications underlying a cellular newtork에서 joint IA 기법과 power allocation 기법을 제안했음. 하지만 이 방법 역시 full CSI 가 필요함.

13. 그러므로 IA-based IM schemes는 large amount of signaling to share CSI가 필요하기 때문에 V2X network에 적용하기에서는 한계점이 있음.

14. 이 논문은 V2I newtork와 V2V network간 공유하는 CSI에 의한 signaling overhead를 reducing 시키는데 초점을 둠.  15. V2V Links와 V2I Link로 부터 생기는 inter-network interference를 제어하기 위해 MIMO V2V link에서 transmit power 뿐만 아니라 data stream의 수까지 조정하는 one-bit signaling-based IM scheme를 제안함.

16. 논문에서 소문자형 bold symbol은 vector, 대문자형 bold symbol은 matrices를 의미한다.

17.

matrix(왼), Inverse marix(오)

18.

  Hermitian tranpose(왼), Frobenius norm(오)

 

SYSTEM MODEL

 

1. 논문에서는 Fig1 처럼 V2I network와 V2V network로 구성된 V2X network로 설정했다.

2. V2I network에서는 Base Station(BS)가 독립적인 data streams를 serve한다. 그리고 Vehicle(VE)의 안테나 수는 N_0 Base Station(BS)의 안테나 수는 M_0 이다. 

3. V2I network에서는 K 개의 direct communication links 가 있다.

4. k 번째 V2V sidelink는 d_k의 독립적인 data streams을 송신하는 V2V Transmitter (VT)와 수신하는 V2V  Receiver(VR)가 구성되어있고 V2V Transmitter (VT)는 M_k 개 만큼의 안테나수, V2V  Receiver(VR)는 N_k 개 만큼의 안테나수로 구성되어 있다.

5. 그리고 V2I network와 V2V network가 multiple antennas로 인한 interference control을 통해 radio resource pool을 공유한다고 가정한다.

6. 각 communication link는 k 로 정의한다. 만약 k가 0이라면 V2I network인 Base Station (BS) to Vehicle(VE) link 이다. k가 1 이상의 값이면 V2V sidelink를 의미한다.

7. 

j번째 transmitter와 i 번째 receiver간의 MIMO fading channel를 의미한다. 

 

8.

V_j 는 j번째 transmitter에서 형성하는 precoding matrices, U_i 는 i 번째 receiver에서 형성하는 decoding matrices를 의미한다.

9. 그리고 Base Station(BS)와 V2V Transmitter (VT)는 주기적으로 pilot signal을 broadcast 한다.

10.  V2V  Receiver(VR)은 pilot signal을 측정하여, V2V network에서 intra-network channel matrices H와 inter-network channel matrix G_i,j 을 추정한다.

 

One-bit signaling-based interference management

1. full CSI-based Interference management(IM) scheme에서 full information of CSI는

는 V2I network에서 Vehicle receiver(VR)이 측정한 것이다.

이 전체 정보를 V2V network에 broadcast하여 Vehicle Transmitter(VT)가 inter-network interference를 제어할 수 있게해야함.

2. 그러나 propsed scheme은 V2V network에서 one-bit information만을 broadcast 한다.

3. V2I network에서 차량은 V2V links로 인한 inter-network를 측정하고 one-bit 정보를 Base station에 피드백한다.

여기서 one-bit 정보는 inter-network interference 가 threshold 값보다 높은지 여부를 의미한다.

즉 Vehicle receiver(VR)가 Base station(BS)이 전송한 pilot signal을 받은 후 다른 V2V Link들에 의한 inter-network interference를 측정하고 Based station(BS)에  threshodl 값보다 높은지 여부를 0 또는 1로 feed back 한다.

4. 이후 Base station(BS)가 one-bit 정보를 V2V network에 broadcast 한다. 

5. Base station(BS)로 부터 one-bit 정보를 broadcast 받은 V2V network의 Vehicle Transmitter(VT)는 one-bit 정보를 기반으로 inter-network interference를 제어 하기 위해 transmit power 또는 data streams 수를 조절한다.

6. 그로므로 제안하는 방법에서는 V2V network에서 V2I network로의 inter-network interference은 시간에 따라 변동 될 수 있다.

 

목표

- 기존 가치 기반 심층 강화학습 (NFQ, DQN, DDQN) 의 문제점을 이해한다.

- Q - function, A - function, V - function의 관계를 이해하고 Dueling DQN/DDQN 강화학습 프레임워크를 이해한다.

- 기존 Replay buffer 에서 수집한 데이터에 대해서 우선순위(priority)를 어떻게 적용하고 데이터를 어떻게 샘플링 하는지 이해한다.

 

기존 가치 기반 심층 강화학습의 문제점(NFQ, DQN, DDQN)

문제점 Q - function을 대상으로 학습 한다.

- Q - function은 현재 State에서 Action을 했을때 기대할 수 있는 Discount factor가 적용된 return 값이다.

- 하지만 Q - function은 아래식처럼 V-function, A-function 들과 관계를 가지고있다. 

- 기존의 DQN/DDQN은 아래의 공식만을 이용해서 학습했다.

- 이 방법의 문제점은 V-function과 A-function의 관계를 고려하지 않고 오직 Q-function 의 값만을 고려하여 학습한다는 의미이다. (결과적으로 정확한 Q-function 값을 찾기 힘들고, Bias가 커질수 있다는 뜻)

- 또한 어떤 행동을 선택해도 괜찮은 상태에서 가지는 Q-function값에 대한 기대치가 틀릴수있다. (비슷한 Q-function 값을 가져야 하는 상황인데에도 노이즈에 의해 편향이 생길 수 있다는 뜻)

 

Dueling 기법

- DNN의 출력을 V-function, A-function 으로 변형 시킨 방법이다.

- DQN, DDQN에 모두 적용 가능하다. (Dueling DQN, Dueling DDQN)

- 아래의 DNN의 구조로 출력하고 학습 시킨다. 

- 강화학습 Agent는 출력 레이어에서 출력된 V-function 값과 A-function 값을 보고 Q-function을 계산한다.

- 주의해야 할 점은 Q-function을  V-function 값과 A-function 값을 이용하여 계산할때 아래 방법 처럼 조금 다른 방법으로 계산한다. (왜 이렇게 하는지는 정확히 이해 못하겠음.. 책에서는 Q-function에 대한 추정치만 이용해서 V-function과 A-function 값을 완전히 복원할 방법이 없기 때문에 Q-function에 average A-function을 뺀다고 설명함)

class FCDuelingQ(nn.Module):
    
    def __init__(self,
                 input_dim,
                 output_dim,
                 hidden_dims=(32,32)
                 activation_fc=F.relu):
        super(FCDuelingQ, self).__init__()
        self.activation_fc = activation_fc

        self.input_layer = nn.Linear(input_dim, hidden_dims[0])
        self.hidden_layer = nn.ModuleList()

        for i in range(len(hidden_dims)-1):
            hidden_layer = nn.Linear(hidden_dims[i], hidden_dims[i+1])
            self.hidden_layers.append(hidden_layer)
        
        #V-function을 위한 출력, 두 출력은 네트워크를 공유함.
        self.output_value = nn.Linear(hidden_dims[-1], 1)

        #A-function을 위한 출력 , 두 출력은 네트워크를 공유함.
        self.output_layer = nn.Linear(hidden_dims[-1], output_dim)

    def forward(self, state):
        x = state

        if not isinstance(x, torch.Tensor):
            x = torch.tensor(x, device=self.device,dtype=torch.float32)
            x = x.unsqueeze(0)

        x = self.activation_fc(self.input_layer(x))

        for hidden_layer in self.hidden_layers:
            x= self.activation_fc(hidden_layer(x))
        
        #출력 레이어에 A-function, V-function 전용으로 레이어를 따로 구성하여 출력함.
        a = self.output_layer(x)
        v = self.output_value(x).expend_as(a)

        #A-function 값과 V-function 값을 이용하여 Q-function 값 계산.
        q = v + a - a.mean(1,keepdim=True).expand_as(a)
        return q

 

PER(Prioritized Experience Replay)

- 기존 Replay buffer에서 경험 튜플 데이터를 효과적으로 샘플링 하는 방법이다.

- 여기서 효과적이란 강화학습 Agent가 학습을 잘하게 한다를 의미한다.

- 학습을 잘한다는 것은 높은 Return을 받는것도 있지만 안좋은 상태를 인지하는 방법도 효과적인 방법이다.

- PER 기법에서는 TD error 값의 절대값이 큰 것이 중요한 경험이라 한다.

- 이를 개산하고 경험 튜플을 아래와 같이 구성하여 replay buffer에 저장한다.

- 그다음 TD error의 값의 크기 순으로 정렬하여 순차대로 데이터를 가져오는 방법이다.

TD error 에 따르는 우선순위를 적용한 확률적 샘플링 방법

- 위의 방법은 노이즈에 매우 취약함으로 TD error 값에 따르는 확률 특성을 적용하는 방법이다.

- 이때 ε 값은 0 인 상황을 막기 위해 매우 작은 값을 넣는다.

- 알파값은 α 값은 우선순위 확률 적용 가중치를 의미한다. 0이면 랜덤 샘플링과 동일하게 수행하고, 1이면 우선순위가 TD error에 따라 비확률적으로 샘플링 한다는 뜻이다. 따라서 0 과 1사이의 값으로 설정해야한다.

 

TD error 에 따르는 Rank를 적용한 확률적 샘플링 방법

- 위의 확률적 샘플링 방법은 특정 TD error 값이 매우 크면 해당 TD error 값에 대한 경험 데이터를 이용할 확률이 높다. 이는 노이즈에 의해 TD error 값이 매우 크게 나올경우 문제가 발생한다.

- 따라서 값에 따라 확률을 나눈다기 보다는 순서라는 값으로 스케일링하여 확률을 적용하는 방법이다.

class PrioritizedReplayBuffer():

    def store(self, sample):
        priority = 1.0
        
        if self.n_entries > 0:
            priority = self.memory[:self.n_entries].max()
            
        self.memory[self.next_index, self.td_error_index] = priority
        self.memory[self.next_index, self.sample_index] = np.array(sample)

        self.n_entries = min(self.n_entries + 1, self.max_samples)

        self.next_index += 1
        self.next_index = self.next_index % self.max_samples

    def update(self, idx, td_errors):
        self.memory[idx, self.td_error_index] = np.abs(td_errors)

        if self.rank_based:
            sorted_arg = self.memory[:self.n_entries, self.td_error_index].argsort()[::-1]
            self.memory[:self.n_entries] = self.memory[sorted_arg]

    def sample(self, batch_size=None):
        
        batch_size = self.batch_size if batch_size == None else batch_size
        self._update_beta()
        entries = self.memory[:self.n_entries]
        if self.rank_based:
            priorities = 1/(np.arange(self.n_entries) + 1)
        else:
            priorities = entries[:, self.td_error_index] + EPS  
        scaled_priorities = priorities**self.alpha

        probs = np.array(scaled_priorities/np.sum(scaled_priorities), dtype=np.float64)

        weights = (self.n_entries * probs)**-self.beta

        normalized_weights = weights/weights.max()

        idxs = np.random.choice(self.n_entries, batch_size, replace=False,p=probs)

        samples = np.array([entries[idx] for idx in idxs])

        samples_stacks = [np.vstack(batch_size) for batch_type in np.vstack(samples[:, self.sample_index]).T]

        idxs_stack = np.vstack(idxs)

        weights_stack = np.vstack(normalized_weights[idxs])

        return idxs_stack, weights_stack, samples_stacks
class PER():
    def optimize_model(self, experiences):
         idxs, weights, (states, actions, rewards, next_states, is_terminals) = experiences
         weights = self.online_model.numpy_float_to_device(weights)
         batch_size = len(is_terminals)

         argmax_a_q_sp = self.onlinde_model(next_states).max(1)[1]
         q_sp = self.target_model(next_states).detach()
         max_a_q_sp = q_sp[np.arange(batch_size), argmax_a_q_sp].unsqueeze(1)

         target_q_sa = rewards + (self.gamma * max_a_q_sp * (1 - is_terminals))

         q_sa = self.onlinde_model(states).gather(1, actions)

         td_error = q_sa - target_q_sa

         value_loss = (weights * td_error).pow(2).mul(0.5).mean()
         self.value_optimizer.zero_grad()
         value_loss.backward()
         torch.nn.utils.clip_grad_norm_(self.onlinde_model.parameters(), self.max_gradient_norm)

         self.value_optimizer.step()

         priorities = np.abs(td_error.detach().cpu().numpy())

         self.replay_buffer.update(idxs, priorities)
    
    def train(self, make_env_fn, make_env_kargs, seed, gamma, max_minutes, max_episodes, goal_mean_100_reward):
        
        for episode in range(1, max_episodes + 1):
            for step in count():
                state, is_terminal = self.interaction_step(state, env)

                if len(self.replay_buffer) > min_samples:
                    experiences = self.replay_buffer.sample()
                    idxs, weights, samples = experiences
                    experiences = self.online_model.load(samples)

                    experiences = (idxs, weights) + (experiences,)

                    self.optimize_model(experiences)
                
                if np.sum(self.episode_timestep) % self.update_target_every_steps == 0:
                    self.update_network()
                
                if is_terminal:
                    break

 

정리

- 기존 DQN, DDQN의 문제점은 Q-function을 V-function과 A-function을 고려하여 추정하지 않았다. 

- Dueling 기법은 강화학습 Agent의 DNN 구조를 V-function, A-function을 추론하여 계산하도록 변경하여 기존의 문제점을 개선하였다.

- 기존 Replay buffer 를 Random 샘플링 방법은 효과적이지 않았다.

- PER 기법은 Replay Buffer에서 TD error 값의 절대치가 큰값에 순위를 적용하여 TD error가 큰 값을 데이터로 추출하여 Agent의 DNN을 학습 시켰다. 

 

 

요약

키오스크는 무인 시스템의 대표 사례이다. 영화관의 키오스크는 무인 기반으로 사용자는 티켓을 구입할 수 있고, 음식점에는 키오스크를 이용하여 음식 주문을 할 수있다. 이와 같이 키오스크는 다양한 자동화 사례에 적용할 수 있다. 하지만 일반적인 사용자가 아닌 외국인, 연세가 많으신 분 들은 키오스크 이용이 매우 어렵다. 따라서 현재 이용하는 사용자의 정보에 맞게 키오스크의 UI를 사용자 적응형으로 개발한다면 더욱 많은 사용자에게 편한 키오스크 사용 경험을 제공할 것이다. 따라서 인접한 사용자의 정보를 받아 키오스크의 UI를 적응형으로 바꾸는 기술은 필요하다.

해당 포스트는 HTTP 통신을 기반으로 Flask framework 서버 프로그램, 키오스크 앱, 사용자 앱을 구분하여 개발한 확장성 있는 통신 시스템을 정리한 포스트이다. 구체적인 구현 코드는 제거하였고 시스템 구현 중 생기는 환경 설정 문제, 사용하면 유용한 함수들을 정리했다. 마지막으로 구현한 통신 시스템의 결과 사진을 공개하고 포스트를 끝마친다.

 

시스템 개발 환경

1. 사용 언어

- python 3.7

AWS IaaS 타입으로 받은 터미널에서 Flask framework 기반으로 서버를 구축하기 위해서 사용했다.

- Kotlin

키오스크, 사용자 앱 개발을 위해 사용했다.

 

2. IDE

- Android studio [DOWN LINK]

- Visual studio code [DOWN LINK]

 

3. IaaS Type Server 

- AWS Lightsail (ubuntu)

AWS EC2 보다 셋팅이 간단하며 무엇보다 3개월 무료로 사용할 수있다. 

 

- Apache

개발한 서버 스크립트를 웹상으로 배포하기 위해 사용하였다. 

설치하는데 도움받은 링크 [LINK]

 

- Flask framework

HTTP 통신을 기반으로 빠르게 구현할 수 있어서 사용하였다.

 

4. Client 사용자 타입

- Android 7.0

기본으로 제공받은 장치의 사양을 따랐다.

5. Client 키오스크 타입

- Android 6.0

기본으로 제공받은 장치의 사양을 따랐다.

 

 

시스템 구상도

구현 핵심 기술 (implementation,  troubleshooting)

1. Flask framework backend 서버 구현

- troubleshooting, implementation link 모음

   1. Flask framework 서버 구현 예제 코드 [LINK]

 

- Flask framework 구현 방법

   2. 구현 방법

    - 데이터 송수신 프로토콜 설계

      키오스크가 접속하는 서버 접속 링크 : http://{SERVERIP}:{PORT}/updatekiosklocation/<kiosk_updateprotocol>

      스마트폰앱이 접속하는 서버 접속 링크 : http://{SERVERIP}:{PORT}/updateuserlocation/<user_updateprotocol>

    - 코드 예시

app = Flask(__name__) 

if __name__ == '__main__':
    #Flask 서버 시작
    app.run(host='0.0.0.0',port=5000)


#스마트폰 유저로 부터 요청을 받았을 경우
@app.route('/updateuserlocation/<user_updateprotocol>')
def Updateuserlocation(user_updateprotocol):
    userdatas = user_updateprotocol.split(',')

    ...
    
    return user_updateprotocol

#키오스크로 부터 요청을 받았을 경우
@app.route('/updatekiosklocation/<kiosk_updateprotocol>')
def Updatekiosklocation(kiosk_updateprotocol):

    kioskdatas = kiosk_updateprotocol.split(',')
    
    ...
    
    return GetNearbyUser(kioskdatas)

2. Android 기기의 GPS 위치 정보 획득 API 사용 

- troubleshooting, implementation link 모음

   1. GPS 위치 정보 획득 [LINK, LINK]

   2. 키오스크에 앱 배포를 위해 빌드하기

       - 상단 툴바에 Generate Signed Bundel / APK 버튼 클릭!

       - APK 체크!

     - 빈칸 채워넣기!

    - release 체크 하고 Finish!

     - 화면 우측하단에 Generate Signed APK 팝업이 뜨면 완료!

     

      - 그다음은 해당 .apk 파일을 구글드라이브를 이용하든 사용하고자 하는 장치에서 다운로드하면 자동으로 설치가 됨!

3. Client와 Server 간의 HTTP 통신 기술 

- troubleshooting, implementation link 모음

   1. HttpURLConnection class와,Thread 를 이용한 HTTP 통신 구현 [LINK]

   2. https 로만 접근 가능했던 문제 해결 방법 [LINK]

- HTTP url 기반 데이터 전송 예시 코드

var urlText = "http://${SERVER_IP}:${SERVER_PORT}/updateuserlocation/${user_info}"
var url = URL(urlText)

//HTTP 연결 시도 + user_info 데이터 전송!
val urlConnection = url.openConnection() as HttpURLConnection

//HTTP 했는가?
if (urlConnection.responseCode == HttpURLConnection.HTTP_OK) {

	//HTTP 연결 성공!
	Log.d(TAG, "Connect OK")
    
    //서버로 부터 회신된 데이터 확인!
	val streamReader = InputStreamReader(urlConnection.inputStream)
    
    //데이터 읽기용 버퍼 생성
	var buffered = BufferedReader(streamReader)

	val content = StringBuilder()
	while (true) {
		val line = buffered.readLine() ?: break
		content.append(line)
	}
	
    //content : 서버로 부터 응답 받은 데이터를 가짐
    
    //데이터 읽기용 버퍼 닫기
	buffered.close()
    
    //연결 종료
	urlConnection.disconnect()
}

 

테스트 사진

통신 시험용 사용자 앱 화면
통신 시험용 키오스크 앱 화면
서버 터미널 화면

'M.S > Toy project' 카테고리의 다른 글

자동 출석 체크 시스템 개발  (2) 2021.04.30

목표

- MSE Loss, MAE Loss, Huber Loss 함수를 이해한다.

- 강화학습 관점에서 각 Loss 함수의 장단점을 이해한다. 

 

MSE(Mean Square Error) Loss 함수

- 평균 제곱 오차를 의미한다.

- 아래 그림은 강화학습에서 MSE를 적용했을때  TD error 값을 어떻게 처리했는지 알 수 있다.

- MSE Loss 함수 장점

    - Loss 값이 0에 가까울 수록 경사가 줄어드면서 backpropagation 시 이동시키는 거리가 작아짐으로 수렴을 도와준다.(최적화에 용이) 

- 강화학습에서 MSE Loss 함수의 단점

    - TD error 값의 절대값이 클 수록 Loss 값이 기하급수적으로 커진다. -> 모든 TD error 범위의 값에 대해서 평등한 Loss 계산이 안된다는 뜻이다. (모든 error에 대한 평등한 Loss 값 x)

MAE(Mean Absolute Error)  Loss 함수

- 평균 절대값 오차를 의미한다.

- 아래 그림은 강화학습에서 MAE를 적용했을때  TD error 값을 어떻게 처리했는지 알 수 있다.

- MAE Loss 함수 장점

   - 모든 error 값에 대해서 평등한 Loss 값 제공. (모든 error 값에 대해 공평함)

- 지도학습에서 MAE Loss 함수의 단점

   -  backpropagation시 수렴이 힘듬 (최적화가 힘듬)

Huber Loss 함수

- MSE Loss 함수의 장점과 MAE Loss 함수의 장점을 섞었다.

- 최적화에 용이 + 모든 error 값에 대해서 공평

- delta 라는 임계값을 두고 error 값을 delta 값과 비교하여 MSE Loss 함수와 MAE Loss 함수를 조건에 따라 쓰는 방법이다.

- delta 값이 0 이면 MAE Loss 함수만 쓰고, delta 값이 무한대이면 MSE Loss 함수만 쓰게 된다.

- 보통 delta 값은 1로 두고 사용한다.

 

정리

- 강화학습에서는 Huber Loss가 좋고 delta 값을 1로 두고 사용한다.

- MSE Loss 함수는 모든 error 값에 대해 공평하지 않다.

- MAE Loss 함수는 최적화 기법에 사용하기에는 힘들다.

- Huber Loss 함수는 delta 임계값을 두고 MSE Loss 함수와 MAE Loss 함수를 조건에 따라 바꿔가며 사용한다.

- Pytorch 모듈에는 이미 Huber Loss 함수가 구현되어 있다. [LINK]

+ Recent posts