Agreed with everyone's suggestions:
1. Get a professional trainer. If what you've been trying hasn't work, a trainer can help you access and suggest different approaches.
2. Apply the obedience training techniques daily, preferably multiple times a day.
3. Don't let him frustrate you. Keep it cool (somehow?

) and don't shout at him - it won't do anything.
Side note: Just think of it like your yelling is like 'barking' to him. If he's barking and you're 'barking' back, you can see, it doesn't resolve anything. I found that it's best to take a deep breath and be calm and confident. Exert a lot of confidence. You need to first believe in yourself that he will soon listen to you. Remove the thoughts that "he's a dick". And believe he can change. It's actually not up to him, but rather it's up to you.
4. Have a lot of patience with him and keeping daily training and you'll reap the rewards later.
Yorkies are a very smart and very high energy breed. They do what they want and will do it the easiest way possible. You need to be persistent with him in the training and gain his respect. Each command needs a lot of patience to teach. Recall is actually one of the most difficult ones. Start with the easy ones. But more importantly, start with getting a really good trainer to help you come up with a plan.
I know it may be very difficult because it got to this stage, but don't despair. As others said, he's testing you in his adolescent ways. Basically, you need to outsmart him and beat him in patience. He needs your guidance. And your trainer will help guide you.