Sounds like issues with your TweenInfo Time and direction.
I’m not really proficient at them, but your first value for your TweenInfo is the time it takes to perform.
Your EasingDirection.InOut makes it tween in both directions, not just one.
TweenPosition acts a bit unpredictably sometimes. Might as well go the extra step and involve TweenService.
Give the below code a shot:
-- LocalScript
local TweenService = game:GetService("TweenService")
local Main = script.Parent
local Top = Main:WaitForChild("Top")
local Bottom = Main:WaitForChild("Bottom")
local ProgressBar = Bottom.LoadingBack.Background.Bar
local tween
tween = TweenService:Create(ProgressBar, TweenInfo.new(4, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {Size = UDim2.new(1, 0, 0, 28)})
tween:Play()
tween.Completed:Wait()
TweenService:Create(Top, TweenInfo.new(3, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Position = UDim2.new(0, 0, -0.5, 0)}):Play()
TweenService:Create(Bottom, TweenInfo.new(3, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Position = UDim2.new(0, 0, 1, 0)}):Play()
Keep in mind that Tweens will not yield the code until they’re finished unless you yield them manually using task.wait() or with Tween.Completed:Wait().